57题-和为s的两个数字

1 题目描述

输入一个递增排序的数组和一个数字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

2 解题思路

利用HashMap可以通过遍历数组找到数字组合,时间和空间复杂度均为O(N);
注意本题的nums是排序数组,因此可使用双指针法将空间复杂度降低至O(1)。

算法流程:

  1. 初始化:双指针i,j分别指向数组nums的左右两端(俗称对撞双指针)。
  2. 循环搜索:当双指针相遇时跳出;
    1. 计算和 s = n u m s [ i ] + n u m s [ j ] s=nums[i]+nums[j] s=nums[i]+nums[j]
    2. s > t a r g e t s > target s>target,则指针j向左移动,即执行 j = j − 1 j=j-1 j=j1
    3. s < t a r g e t s < target s<target,则指针i向左移动,即执行 i = i + 1 i=i+1 i=i+1
    4. s = t a r g e t s = target s=target,立即返回数组 [ n u m s [ i ] , n u m s [ j ] ] [nums[i],nums[j]] [nums[i],nums[j]]
  3. 返回空数组,代表无和为target的数字组合。

正确性证明:

记每个状态为 S ( i , j ) S(i,j) S(i,j),即 S ( i , j ) = n u m s [ i ] + n u m s [ j ] S(i,j)=nums[i]+nums[j] S(i,j)=nums[i]+nums[j]。假设 S ( i , j ) < t a r g e t S(i,j)<target S(i,j)<target,则执行i=i+1,即状态切换至 S ( i + 1 , j ) S(i+1,j) S(i+1,j)

  • 状态S(i,j)切换至S(i+1,j),则会消失一行元素,相当于消去了状态集合 { S ( i , i + 1 ) , S ( i , i + 2 ) , . . . , S ( i , j − 2 ) , S ( i , j − 1 ) , S ( i , j ) } \{ S(i,i+1),S(i,i+2),...,S(i,j-2),S(i,j-1),S(i,j) \} { S(i,i+1),S(i,i+2),...,S(i,j2),S(i,j1),S(i,j)}。(由于双指针都是向中间收缩,因此这些状态之后不可能再遇到)。
  • 由于nums是排序数组,因此这些消去的状态都一定满足 S ( i , j ) < t a r g e t S(i,j)<target S(i,j)<target,即这些状态都不是解。
  • 结论:以上分析已证明“每次指针i的移动操作,都不会导致解的丢失”,即指针i的移动操作是安全的;同理,对于指针j可得出同样推论;因此,此双指针法是正确的。

在这里插入图片描述

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

复杂度分析:

  • 时间复杂度 O(N) : N 为数组 nums 的长度;双指针共同线性遍历整个数组。
  • 空间复杂度 O(1) : 变量 i, j 使用常数大小的额外空间。

猜你喜欢

转载自blog.csdn.net/qq_41242680/article/details/113500642