167. Two Sum II - Input Array Is Sorted
167. Two Sum II - Input Array Is Sorted
题目
Given a 1-indexed array of integers numbers
that is already sorted in non-decreasing order , find two numbers such that they add up to a specific target
number. Let these two numbers be numbers[index1]
and numbers[index2]
where 1 <= index1 < index2 < numbers.length
.
Return the indices of the two numbers,index1
and index2
_, added by one as an integer array _[index1, index2]
of length 2.
The tests are generated such that there is exactly one solution. You may not use the same element twice.
Your solution must use only constant extra space.
Example 1:
Input: numbers = [ 2 , 7 ,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].
Example 2:
Input: numbers = [ 2 ,3, 4 ], target = 6
Output: [1,3]
Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].
Example 3:
Input: numbers = [ -1 , 0 ], target = -1
Output: [1,2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].
Constraints:
2 <= numbers.length <= 3 * 10^4
-1000 <= numbers[i] <= 1000
numbers
is sorted in non-decreasing order.-1000 <= target <= 1000
- The tests are generated such that there is exactly one solution.
题目大意
找出两个数之和等于 target 的两个数字,要求输出它们的下标。注意一个数字不能使用 2 次。下标从小到大输出。假定题目一定有一个解。
解题思路
这一题比 第 1 题 Two Sum 的问题还要简单,因为这里数组是有序的。可以直接用第一题的解法解决这道题。
代码
// 解法一 这一题可以利用数组有序的特性,使用对撞指针
/**
* @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) {
return [i + 1, j + 1];
} else if (numbers[i] + numbers[j] < target) {
i++;
} else {
j--;
}
}
};
// 解法二 不管数组是否有序,空间复杂度比上一种解法要多 O(n)
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let obj = {};
for (let i = 0; i < nums.length; i++) {
let another = target - nums[i];
if (another in obj) {
return [obj[another], i];
}
obj[nums[i]] = i;
}
};
相关题目
- [1. 两数之和](./0001.md)
- [653. 两数之和 IV - 输入二叉搜索树](https://leetcode.com/problems/two-sum-iv-input-is-a-bst)
- [🔒 Two Sum Less Than K](https://leetcode.com/problems/two-sum-less-than-k)