题目:给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
首先想到的是最简单的双重循环:
function twoSum(numbers, target) {
// write code here
let arr = [];
for (let i = 0; i < numbers.length; i++) {
for (let j = i+1; j < numbers.length; j++) {
if (numbers[i] + numbers[j] === target) {
arr.push(i + 1);
arr.push(j + 1);
return arr;
}
}
}
}
然后报错:执行时间过长。一看用例,好家伙,成百上千个九位数十位数组成的数组,执行时间能不长吗。
想起leetcode上有一模一样的题,不限制时间复杂度。不得不感叹牛客有时候比leetcode严。
以下是正确思路:
function twoSum(numbers, target) {
let arr=[]
for(let i=0;i<numbers.length;i++){
let diff=target-numbers[i] //当前元素与target的差值
if(arr[diff]==undefined){
arr[numbers[i]]=i //当前元素以下标的形式存入新数组
}else{ //当发现后续某元素与target的差值已存在,说明找到了和为target的两个元素
return [ arr[diff]+1,i+1]
}
}
}
这个方法的重点和巧妙之处在于:
把前面的元素作为数组下标保存起来,这样后面的元素与target的差可以通过查找数组元素的方式比对出来。注意点:以下标形式存入数组时其值必须为该元素在原数组中的位置i,否则后面取不到他的位置。