剑指 Offer II 006. 排序数组中两个数字之和

导读:本篇文章讲解 剑指 Offer II 006. 排序数组中两个数字之和,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目

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

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

假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。

示例 1:

输入:numbers = [1,2,4,6,10], target = 8
输出:[1,3]
解释:2 与 6 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。
示例 2:

输入:numbers = [2,3,4], target = 6
输出:[0,2]
示例 3:

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

提示:

2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 递增顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

分析

使用双指针的方式:
一个指向第一个位置,一个指向第二个位置。
因为是排好序的,那么当两个指针相加大于目标值的时候,将右边的指针左移;当小于目标值的时候,将左边的指针右移

代码

里面查考了书上的代码,然后自己重新又敲了一遍。
里面注释很清楚

数组类算法总结

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        // 定义双指针,头尾指针
        int left=0;
        int right=numbers.length-1;
        // 迭代遍历[ && left < right此条件在该情况中可以不加]
        while(numbers[left]+numbers[right] != target && left < right){
            // 由于是排好序的。那么相加小于目标值,将左指针右移动;当大于目标值时,将右指针左移
            if(numbers[left]+numbers[right] < target){
                left++;
            }else{
                right--;
            }
        }
        return new int[] {left,right}; 
    }
   
}

二刷

class Solution {
    // 数组、排好序、两数和=》反向双指针(一个指向头,一个指向尾)
    public int[] twoSum(int[] numbers, int target) {
        // 判空
        if(numbers.length == 0){
            return null;
        }
        // 定义双指针
        int p1 = 0;
        int p2 = numbers.length - 1;
        // 定义返回值
        int[] res = new int[2];

        // 可以这样去移动,前提是因为这是排好序的
        while(p1 < p2){
            // 大于目标值,右指针左移
            if(numbers[p1] + numbers[p2] > target){
                p2 --;
            }
            // 小于目标值,左指针右移动
            if(numbers[p1] + numbers[p2] < target){
                p1 ++;
            }
            // 相等直接返回
             if(numbers[p1] + numbers[p2] == target){
               res[0] = p1;
               res[1] = p2;
               break;
            }
        }
        return res;

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96224.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!