给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
此题目是leetCode第一题,我刚写这个题目的时候想到的就是暴力破解法,当然这个也是平时用的比较多的方法(没有学习算法的时候),现在我就分享一下我现在所用的两种方法,方法很多,我还只知道两种,欢迎指正。
- 第一种方法就是暴力破解法,何为暴力破解法,就是通过两层遍历循环,直接判断nums[i]+nums[i+1]=target,如果相等,return这两数的下标,代码如下;
/**
1. @param {number[]} nums
2. @param {number} target
3. @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]
}
}
}
};
此方式虽然是解决了这一题,但是效率有点低,leetCode提交验证执行用时:172 ms,这个时间有浮动,但是也能反应出这个暴力破解确实速度有点慢,原因当然是两次循环的时候有重复计算,所以我又去探索了下新的解决思路,也就是第二种方式,空间换时间。
2. 空间换时间,何为空间换时间呢?我的理解就是,目标值是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;
}
};
总结:两数之和相对来说好理解一点,但是方式方法远不止我所理解的这两点,还有待提高与探索,欢迎分享指证。