题目描述:
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
* 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <=
* numbers.length 。
*
* 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
解题思路:
- 一开始的想法有点蠢,有一个 start 指针,然后一个 end 指针,end 指针就从 start 后一个开始往后排,大了就挪 start , 小了就挪 end , end 到底了再挪 start。这不就是双层循环吗。。。
- 直接一头一尾两个指针往中间去就可以了。
解法一(耗时耗力的笨办法,第一次答案):
function twoSum(numbers: number[], target: number): number[] {
let start = 0;
let end = 1;
while (start < numbers.length) {
if (numbers[start] + numbers[end] === target) {
break;
} else if (numbers[start] + numbers[end] < target) {
end++;
if (end >= numbers.length) {
start++;
end = start + 1;
}
} else {
start++;
end = start + 1;
}
}
return [start + 1, end + 1];
}
用时:
Your runtime beats 7.46 % of typescript submissions
// Your memory usage beats 55.7 % of typescript submissions (43.1 MB)
解法二(正常的双指针):
function twoSum(numbers: number[], target: number): number[] {
let start = 0;
let end = numbers.length - 1;
while (start < end) {
if (numbers[start] + numbers[end] === target) {
break;
} else if (numbers[start] + numbers[end] > target) {
end--;
} else {
start++;
}
}
return [start + 1, end + 1];
}
用时:
// Your runtime beats 55.26 % of typescript submissions
// Your memory usage beats 83.33 % of typescript submissions (43.1 MB)