题目内容
给定一个整数数组 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() 方法不是应当使用的工具。
// 因此上述代码没用。
};
解法二,用对象巧取
思路:目前已知target值,且给定的数组一定会存在两个有效目标值。假定循环中的数值都可能成为答案,计算出目标值与当前循环数值的差。并且把当前数值的坐标以以数值为key下表为value的对象形式保存。在后面的某次循环中总会找到一个res在obj中了。此时,obj中的那个下表和当前循环的下标就是答案。
javascript
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)