力扣刷题笔记【双指针篇】 → 167. 两数之和 II - 输入有序数组

179 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length

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

示例

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

输入: numbers = [2,3,4], target = 6
输出: [1,3]

输入: numbers = [-1,0], target = -1
输出: [1,2]

提示

  • 2 <= numbers.length <= 3 * 10^4
  • `-1000 <= numbers[i] <= 10001
  • numbers非递减顺序 排列
  • -1000 <= target <= 1000
  • 仅存在一个有效答案

解题思路

双指针

这算是最基础的双指针模版了,定义好左右边界之后,逐位向中间移动,得到结果并返回。

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        // 定义左右两个指针,left,right 注意边界为[0, n - 1]
        int left = 0, right = numbers.length - 1;
        
        // 题目要求不能使用相同元素,这里终止条件为left小于right
        while(left < right){
            // 相加结果大于目标值,则右边指针左移
            if(numbers[left] + numbers[right] > target){
                --right;
            }else if(numbers[left] + numbers[right] < target){
                // 相加结果小于目标值,则左边指针右移
                ++left;
            }else{
                // 找到目标值,这里记得索引需要各自 +1,因为题目中说明是从1开始而不是从0开始
                return new int[]{left + 1, right + 1};
            }
        }

        return new int[0];
    }
}

 复杂度分析

  •   时间复杂度:O(N)O(N)
  •   空间复杂度:O(1)O(1)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/tw…