1,题目
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
2,代码
利用哈希表
利用数组迭代器 Map数据结构
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
let hashTable = new Map();
for(let [index,value] of numbers.entries()){
if(hashTable.has(target - value)){
return [hashTable.get(target - value)+1,index+1];
}
hashTable.set(value,index);
}
return [];
};
缩减空间和双指针
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
// 双指针
let i =0;
let j = numbers.length -1;
while(i < j){
if(numbers[i] + numbers[j] > target){
j--;
}else if(numbers[i] + numbers[j] < target){
i++;
}else{
return [i+1,j+1];
}
}
return [-1,-1];
};
循环条件
low < high
:循环继续的条件是low
指针小于high
指针。这个条件确保了只要两个指针不交叉(即我们还没有考察过所有可能的数对),循环就会继续。一旦low
等于或大于high
,意味着所有可能的数对都已经被考虑过了,如果没有找到满足条件的数对,循环就会结束。使用
low < high
作为循环条件的好处是,它避免了对同一个元素的重复考虑(因为low
和high
不会指向同一个元素),同时确保了算法能够高效地缩小查找范围,直到找到解或确定没有解。