和为s的两个数字(简单难度)

题目概述(简单难度)

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

附上leetcode链接:
点击此处进入leetcode

思路与代码

思路展现

这道题目首先告诉我们数组是一个递增排序的数组,所以此时我们想到可以用双指针法来做这道题目.
思路如下:

指针 i指向数组首位数字,指针 j 指向数组末位数字。
若两数字之和s大于了 target,则指针 j 往左移一位。
若两数字之和s小于了 target,则指针 i 往右移一位。
若两数字之和s等于了 target,返回结果 [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){
    
    
              i++; 
           }else if(s>target){
    
    
              j--;
           }else{
    
    
              return new int[]{
    
    nums[i],nums[j]}; 
           }   
       }
       return new int[0];
    }
}

总结

1:此算法
时间复杂度O(N):N 为数组 numsnums 的长度
空间复杂度O(1):变量 i, j 使用常数大小的额外空间
2:数组的双指针思路,是针对数组是有序数组,正因为如此我们才将这道算法题目的空间复杂度降到了O(1).

Guess you like

Origin blog.csdn.net/qq_41972686/article/details/119575134