我们先来看一下两数之和的题意...
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
首先我们来看第一种解法儿
var nums = [2, 7, 11, 15];
function twoSum(arr, target) {
var brr = [];
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length; j++) {
if (arr[i] + arr[j] === target) {
brr[0] = j;
brr[1] = i;
}
}
}
return brr;
}
let result = twoSum(nums, 18);
console.log(result)
这种方法是用两层循环解出来的,也叫暴力法,很好理解,简单暴力,就是先把数据循环一次,然后每循环到一个值的时候,再把所有的数据循环一次然后去比对,看看两个值是不是符合条件。这种方法的时间复杂度:O(n^2),空间复杂度为O(1)。简单的来说,两层for循环肯定要大很多,那么问题就来了,我们能不能用一层循环就把这个问题解决呢??
我们来看看第二种方法,一层循环的解法。
var nums = [2, 7, 11, 15];
function twoSum(arr, target) {
var obj = {};
var brr = [];
//debugger;
for (var i = 0; i < arr.length; i++) {
let a = arr[i];
let b = target - a;
if (obj[a] !== undefined) {
brr = [obj[a], i];
} else {
obj[b] = i;
}
}
return brr;
}
let result = twoSum(nums, 9);
console.log(result)
这种方法我们用了一遍哈希表也就是一层循环,相比之前第一种方法,时间复杂度变为了O(n),空间复杂度:O(n)。很明显这种方法压力会比第一中轻很多。就是把值先存在一个地方,然后看看有没有和他匹配的值。
在开始我们算法旅程的时候,debugger是一个特别好用的东西,可以把代码中的注释解开,就是我们常说的打断点,然后去看每一次循环中的值得变化,便于我们更好的去理清逻辑。