# 1.两数之和
| 题目类别 | 
|---|
| 哈希表 | 
# 题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
# 自己思路
本人的思路是根据目标值和数组各项的差值,然后循环判断数组哪项和差值相等,再返回数组下标,这样就导致了可能目标值和数组某项差值等于该项自身值等问题。
# 大神思路
- 初始化一个 
map = new Map() - 从第一个元素开始遍历 
nums - 获取目标值与 
nums[i]的差值,即k = target - nums[i],判断差值在map中是否存在 
- 不存在( 
map.has(k)为false) ,则将nums[i]加入到map中(key为nums[i], value为i,方便查找map中是否存在某值,并可以通过get方法直接拿到下标) - 存在( 
map.has(k)),返回[map.get(k), i],求解结束 
- 遍历结束,则 
nums中没有符合条件的两个数,返回[] 
var twoSum = function(nums, target) {    
  let map = new Map()    
  for(let i = 0; i< nums.length; i++) {        
    let k = target-nums[i]        
    if(map.has(k)) {            
      return [map.get(k), i]        
    }        
    map.set(nums[i], i)    
  }    
  return [];
};  // 时间复杂度O(n)
 1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 其他解法
- 暴力法
 
- 使用两层循环,外层循环计算 当前元素与
target之间的差值,内层循环寻找该差值,若找到该差值,则返回两个元素的下标。 - 时间复杂度: O(n^2)
 
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
  for(var i = 0; i<nums.length; i++) {
    var dif = target - nums[i];
    // j = i+1 的目的是减少重复计算和避免两个元素下标相同
    for(var j = i+1;j<nums.length;j++) {
      if(nums[j] == dif)
        return [i,j]
    }
  }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 利用数组减少查询时间
 
- 使用一层循环,每遍历到一个元素就计算该元素与 
target之间的差值dif,然后以dif为下标到数组temp中寻找,如果 temp[dif] 有值(即不是undefined),则返回两个元素在数组nums的下标,如果没有找到,则将当前元素存入数组temp中。 - 时间复杂度:O(n)
 
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
  var temp = []
  for(var i = 0;i<nums.length;i++) {
    var dir = target - nums[i];
    if(temp[dif] != undefined){
      return [temp[dir], i];
    }
    temp[nums[i]] = i;
  }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15