题目概述(简单难度)
输入一个递增排序的数组和一个数字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)
.