Two Sum--LeetCode

问题描述

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

问题分析

人话:给出一个数字数组,找出数组内两个相加等于目标数字的元素,这两个元素的下标组成的数组就是问题的答案了
一开始我想到的最简单的方法是双重循环,比如:【1,2,3】,当第一层循环的当前元素是1的时候,就对【2,3】进行循环,分别判断1+2和1+3是否等于目标数字,如果都不符合就继续第一层循环。因为我使用的语言是JavaScript,JavaScript有个方法indexOf,可以定位元素在数组的位置,所以可以对第二层循环进行封装。

问题解决

 var twoSum = function(nums, target) {
 let result=[];   //最终结果
 //len = nums.length:把nums的长度缓存起来,可以节省循环中每一次查询nums长度的时间
 for(let i = 0,len = nums.length; i < len; i++){
     for(let j = i+1, len = nums.length; j

使用indexOf方法:

var twoSum = function(nums, target) {
 let result=[];
 for(let i = 0, len = nums.length; i < len; i++){
     let index = nums.indexOf( target - nums[i] );
     if(index >= 0 && index != i){
         result.push(i);
         result.push(index);
         break;
     }
 }
 return result;
 };
//index != i:因为indexOf是返回数组中第一个符合条件的元素的下标,比如[ 1, 2, 1].indexOf( 1 ),结果是0。index != i目的是过滤掉下标与当前循环下标相同的元素。

第一种方法的时间复杂度是O(n * (n -1)),即O(n * n),LeetCode显示的代码运行时间是124ms;第二种方法的时间复杂度是O( n * n),运行时间为220ms。两者的时间复杂度相同,但是细微的差别就是第二种方法在nums为【3,3】的情况下需要运行完两个循环(indexOf实质上就是一层循环),而第一种方法在两层循环中各循环一次就能找到最终结果。

总结

1.学会计算算法的时间复杂度,以此来比较算法在当前情况的优劣,尽量使用时间复杂度低的算法
2.举一反三,面对一个问题时,应该想办法去思考多种解决方法,扩展思路,在多个解决方法中选择最优。
3.阅读英文文档或文章时,文档中的代码会帮助我们理解文档,就算读不懂文档,看代码也能解决问题。

你可能感兴趣的:(Two Sum--LeetCode)