# 题目内容

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

# 解法一,暴力破解

看完第一遍题目,可以非常自然的想到使用双层循环直接暴力计算。即挨个相加,判断是否等于目标值,如果等于则返回当前循环数的下标。但毫无疑问时间复杂度会比较高。

在暴力破解中的遇到的一个问题,最开始是直接使用两个forEach,但一直就无法通过submit。后面看了MDN文档才发现“除了抛出异常以外,没有别的办法终端forEach循环”,因此return 里的东西不会被return。

var twoSum = function (nums, target) {
    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                return [i, j]
            }
        }
    }
    // nums.forEach((e, i) => {
    //      nums.forEach((m, n) => {
    //          if (e + m === target) {
    //              return [i, n]
    //          }
    //      })
    // })
    // 除了抛出异常以外,没有办法中止或跳出 forEach() 循环。
    // 如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。 
    // 因此上述代码没用。
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 解法二,用对象巧取

思路:目前已知target值,且给定的数组一定会存在两个有效目标值。假定循环中的数值都可能成为答案,计算出目标值与当前循环数值的差。并且把当前数值的坐标以以数值为key下表为value的对象形式保存。在后面的某次循环中总会找到一个res在obj中了。此时,obj中的那个下表和当前循环的下标就是答案。

const twoSum = (nums, target) => {
const obj = {}
for (let i = 0, len = nums.length; i < len; ++i) {
    const data = nums[i]
    const res = target - data
    if (res in obj) {
        return [obj[res], i]
    }
    obj[data] = i
}

// 许久没做,竟然做不出来
let map = {}
for(let i =0; i< nums.length; i++ ) {
    if (map[target - nums[i]] !== undefined) {
      return [map[target - nums[i]], i]
    } else {
      map[nums[i]] = i
    }
}
}
twoSum([7, 2, 11, 16], 9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
一笔写于: 9/25/2021, 9:36:06 PM
扫码添加我的微信
个人
个人号
公众号
公众号