「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例1
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例2
输入: nums = [3,2,4], target = 6
输出: [1,2]
题解
这是我刚接触leetcode的时候解决的第一个问题。印象非常深刻,一个是因为刚接触算法感到新奇,一个是这题的解法,使用额外空间可以提高运行效率(后来知道这叫降低时间复杂度),给我惊呆了。原来还可以这样?
暴力循环
刚学会冒泡排序,冒泡排序是比较任意两个值大小,这里是运算任意两个值的和;所以通过嵌套for循环将数组中所有可能和得到并且与目标值target对比;当任意两个值当和===target;返回两个值所在的下标即可。
根据上述思路编辑代码如下:
暴力代码
var twoSum = function(nums, target) {
for(let i = 0 ; i < nums.length ; i++){
const n = nums[i];
for(let j = i +1 ; j < nums.length ; j++){
const t = nums[i] + nums[j];
if(t === target) return [i,j];
}
}
};
哈希map
这段话与题解无关如无兴趣请忽略
使用暴力循环解决了这个问题,提交代码也是通过的。当初我也一位这个问题就是这个解法。因为题目类型就是个简单类型的题,还能有其他解法吗?原谅当初无知的我吧!后来经过一段时间使用leetcode知道了【题解】这个东西;于是,这里打开了我的新大门,在题解中提到的时间复杂度的概念,暴力枚举时间复杂度为,请在此原谅当初无知的我,我感觉【暴力】有什么不好吗?难道暴力解决问题不man吗?现在想想真想打死当初的我啊,丢人。再后来发现在算法中【暴力】一般表示最差的算法思路,做大量对结果不会产生影响的运算一般被称为暴力,如果能减去这些无用的运算,叫剪枝;哈哈扯远了
哈希map
哈希map的是通过空间换取时间。根据示例中给出的数据为例子
使用map存储已经枚举过的值,并且记录值所在的下标
- 枚举第一个元素2,;7在map中存在吗?不存在,将2放入map中map = {2:0},继续
- 枚举第二个元素2,;a在map中存在吗?存在,返回
如果枚举到最后一个元素,依然在map中找不到,返回空数组
根据上述思路编辑代码如下:
JavaScript代码
var twoSum = function (nums, target) {
const map = {}
for (let i = 0; i < nums.length; i++) {
const n = nums[i]
const k = target - n
if (map[n] === undefined) {
map[k] = i
} else {
return [i, map[n]]
}
}
return []
}