掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述
给定一个整数数组 nums 和一个整数目标值 target,
请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
eg1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
eg2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
eg3:
输入:nums = [3,3], target = 6
输出:[0,1]
eg4:
输入:nums = [2,5,5,11], target = 10
输出:[1,2]
二、思路分析
题目中要找到数组两项之和等于target,
思路一:
比较简单的一个思路,就是双层for循环,找到两数之和等于target,
返回出下标,遍历完都没有找到的话,返回空数组。时间复杂度:O(n * (n - 1) / 2)
思路二:哈希表:
遍历的同时,记录一些信息,省去一层循环
需要记录已经遍历过的数值和它对应的下标,借助查表实现 时间:O(n)
三、解题代码
- 思路一:
function twoSum(nums, target) {
let len = nums.length
if (len <= 1) return []
for (let i = 0; i < len; i ++) {
for (let j = i + 1; j < len; j ++) {
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
return []
}
- 思路二:
function twoSum(nums, target) {
// 申明一个Map对象,用来保存循环后的数值
const len = nums.length
if (len <= 1) return []
const MAP = new Map()
for (let i = 0; i < len; i ++) {
const other = target - nums[i] // 目标值减去当前遍历的值,剩余的值
// 因为 other + nums[i] 等于 target
// 所以如果判断出缓存Map里有other,
// 那么当前循环就有nums[i] + other 等于target
if (MAP.get(other) !== undefined) return [MAP.get(other), i]
MAP.set(nums[i], i)
}
return []
}
四、总结
-
做一道算法题时,首先要能做出来,哪怕是用最劣质的方法,然后去完善一些边界情况,比如本题nums.length <= 1 时,就可以直接返回[], 以提前结束运行。
-
做完后,分析一下时间复杂度,空间复杂度。有没有通过空间换时间的解法,把这运用在实际项目中,也是可以提高运行速度的。
-
看下leetCode 题解,其他人跟自己的解法有何不同,有何优劣之分等等。