算法练习第5道-两数之和 II - 输入有序数组

161 阅读1分钟

一、题目

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:27 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。


示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:24 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。


示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-10 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

  作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、 思路

思路1

  • 加法我们首先要拿到第一个值,第一个值,我们可以采用遍历的形式拿到
  • 但是拿到第一个值后,我们要紧接拿第二个值,第二个值不能拿第一位值,因此,在第二个循环中,应该加1
  • 拿到两个值后,我们做比较,判断是否相同,如果相同就返回当前两个坐标并加1
  • 如果不同,那就继续遍历第二位数,如果能找到就返回当前两个坐标,如果找不到,那么就换第一位数,再依次比较

思路2

双指针解法

  • 定义左右指针left,right, left = 0, right = number.length -1
  • 判断左指针的第一位加右指针的第一位是否等于target,
  • 如果相加和大于target,那么左指针向左移动一位,
  • 如果相加小于target,那么右指针向左移动一位
  • 依次移动,直到得到下标
  • 当前下标是从0开始的,所以左右各加1

三、代码

思路1

首先,我们要确定数组的长度

let len = numbers.length

然后遍历我们的第一位数

  for(let i = 0; i < len; i++) {
    let index1 = numbers[i]
    ....
  }

拿到第一位数后,我们就要去遍历第二位数,第二位数要在第一位数下标上加1

for(let j = i+1; j < len; j++) {
     numbers[j]
}

现在要判断他们是否等于目标值,如果等于就返回坐标加1

if(target == (index1+numbers[j])) {
          return [i+1, j+1]
}

整体代码如下

let len = numbers.length
for(let i = 0; i < len; i++) {
    let index1 = numbers[i]
      for(let j = i+1; j < len; j++) {
        if(target == (index1+numbers[j])) {
          return [i+1, j+1]
        }
      }
}

思路2

let twoSum = function(numbers, target) {
  console.log(numbers, target)
  let left = 0, right = numbers.length - 1
  while(left < right) {
    let total = numbers[left]+numbers[right]
    if(total < target) {
      left++
    } else if(total>target) {
      right--
    } else if(total === target) {
      return [left+1, right+1]
    }
  }
  
  return [left, right]
}

四、测试结果

测试用例1

image.png

测试用例2

image.png