跳至主要內容

167. Two Sum II - Input Array Is Sorted


167. Two Sum II - Input Array Is Sortedopen in new window

🟠   🔖  数组 双指针 二分查找  🔗 LeetCodeopen in new window

题目

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)