力扣---剑指 Offer 57. 和为s的两个数字

发布时间 2023-03-31 19:18:52作者: Owlwu

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

 

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
 

限制:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

这道题大概算是两数之和的进阶吧。所以两数之和的方法也可以做。

只不过如果利用题目给的递增的条件,可以用双指针同时从两边开始遍历,指针指向元素的和大于target,右指针左移,否则左指针右移。如果等于,直接返回。

哈希表:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Set<Integer> set = new HashSet<>();
        int[] res = new int[2];
        for (int x : nums) {
            if (set.contains(target - x)) {
                res[0] = x;
                res[1] = target - x;
                break;
            }
            set.add(x);
        }
        return res;
    }
}

 

 双指针:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int p1 = 0;
        int p2 = nums.length - 1;
        while (p1 < p2) {
            int tem = nums[p1] + nums[p2];
            if (tem > target) {
                p2 --;
            } else if (tem < target) {
                p1 ++;
            } else {
                break;
            }
        }
        return new int[] {nums[p1], nums[p2]};
    }
}