题目
解题思路
双指针技巧能解决nSum问题,(有序数组)
left=0, right=nums.length-1;
- 如果
nums[left] + nums[right] === target
则返回 - 如果
nums[left] + nums[right] > target; right--;
降低整体和 - 如果
nums[left] + nums[right] < target; left++;
增加整体和 - 注意此时的双指针技巧仅仅适用于有序数组
代码
// 利用 target = num1 + num2 => num1 = target - num2 的形式,将每一次遍历过的数据存储起来,遍历数组检查是否存在即可
// 对于此类计算公式,应该记住:如果有一个等式并且需要遍历,那么可以考虑用这种技巧降低时间复杂度
function twoSum1(numbers: number[], target: number): number[] {
const map = new Map<number, number>();
for (let i = 0; i < numbers.length; i++) {
const num = target - numbers[i];
if (map.has(num)) {
return [map.get(num) + 1, i + 1]
}
map.set(numbers[i], i)
}
return [-1, -1]
};
// 以上对于双指针技巧来说还是有点浪费空间,并且双指针技巧更能解决nSum问题
// left=0, right=nums.length-1; 如果 nums[left] + nums[right] === target 则返回
// 如果 nums[left] + nums[right] > target; right--; 降低整体和
// 如果 nums[left] + nums[right] < target; left++; 增加整体和
// 注意此时的双指针技巧仅仅适用于有序的数组
function twoSum(nums: number[], target: number): number[] {
let l: number = 0, r: number = nums.length - 1;
while (l < r) {
const left = nums[l], right = nums[r];
if (left + right === target) {
return [l + 1, r + 1]; // 返回
} else if (left + right > target) {
r--; // 降低整体大小
} else {
l++; // 增加整体大小
}
}
return [-1, -1];
};