LeetCode 167. 两数之和 II

题目链接

167. 两数之和 II - 输入有序数组

题目分析

非常简单的一个题目,因为给定的是一个有序数组,我们可以直接使用双指针思想去寻找两个目标元素。如果num[left] + num[right]==target 就保存循环结果然后退出循环,否则就看大小移动left或者right指针。
其实这个题还可以做二分查找 ,我们外层循环使用一个i去遍历0num.length-2这么多的元素,然后我们在内层使用二分查找,查找target-num[i]是否在数组inum.length-1中,存在的话就保存结果然后退出循环。
这个题其实是1. 两数之和的变种,第一题的输入数据是无序的,但是如果我们预处理输入数组后,也会变成这题的做法。对于第一题,我们最好的方法就是使用一个hashmap作为缓存,只需要一个O(n)的时间复杂度就可以完成解题。

代码实现

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] res = new int[2];
        int left = 0;
        int right = numbers.length - 1;
        while(left < right){
            if(numbers[left] + numbers[right] == target){
                res[0] = left+1;
                res[1] = right+1;
                break;
            }else if(numbers[left] + numbers[right] > target){
                right--;
            }else if(numbers[left] + numbers[right] < target){
                left++;
            }
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/ZJPaang/p/13343224.html