两数之和
前端小菜-贺俊兰 2020-08-10 LeetCode
# 介绍
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
例如
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1
2
3
4
2
3
4
# 题解
方法千千万,我这里就列两种。
# 暴力破解
就是通过两层遍历循环,直接判断nums[i]+nums[i+1]=target,如果相等,return这两数的下标。
代码如下
/**
@param {number[]} nums
@param {number} target
@return {number[]}
*/
var twoSum = function(nums, target) {
for(var i=0;i<nums.length-1;i++){
for(var k=i+1;k<nums.length;k++){
if(nums[i]+nums[k]==target){
return [i,k]
}
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
此方式虽然是解决了这一题,但是效率有点低,leetCode提交验证执行用时:172 ms,这个时间有浮动, 但是也能反应出这个暴力破解确实速度有点慢,原因当然是两次循环的时候有重复计算,所以我又去探索了 下新的解决思路,也就是第二种方式,空间换时间。
# 空间换时间
我的理解就是,目标值是9,当我知道第一个数是2后,我知道我需要的数是什么了,那样我再去集合里去寻 找另一个数,这样的遍历就极大的缩短了两个数的匹配时间。
代码如下
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let obj = {};
for (let i = 0; i < nums.length; i++) {
let diff = target - nums[i];
if (obj[diff] >=0 ) {
return [obj[diff], i];
}
obj[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
两数之和相对来说好理解一点,但是方式方法远不止我所理解的这两点,还有待提高与探索。