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

简介: 和为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).


相关文章
|
6月前
|
算法 C#
详尽分享计算一个数字有多少种排列可能
详尽分享计算一个数字有多少种排列可能
52 0
判断一个数字是否可以表示成三的幂的和(难度:中等)
判断一个数字是否可以表示成三的幂的和(难度:中等)
|
机器学习/深度学习 测试技术 Windows
数字基带传输系统设计
数字基带传输系统设计
151 0
|
算法 前端开发
前端算法-数字出现一次
前端算法-数字出现一次
无重复字符的最长子串(中等难度)
无重复字符的最长子串(中等难度)
76 1
无重复字符的最长子串(中等难度)
|
存储 测试技术
只出现一次的数字(简单难度)
只出现一次的数字(简单难度)
104 0
只出现一次的数字(简单难度)
|
存储 测试技术
0~n-1中缺失的数字(简单难度)
0~n-1中缺失的数字(简单难度)
122 0
0~n-1中缺失的数字(简单难度)
数组中数字出现的次数(中等难度)
数组中数字出现的次数(中等难度)
95 0
数组中数字出现的次数(中等难度)
|
算法 索引
数组中重复的数字(简单难度)
数组中重复的数字(简单难度)
95 0
数组中重复的数字(简单难度)
排序数组中只出现一次的数字(中等难度,三种方法)
排序数组中只出现一次的数字(中等难度,三种方法)
114 0
排序数组中只出现一次的数字(中等难度,三种方法)