https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/
题目描述
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
输入输出样例
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
题解
一开始想的是使用HashMap,这样可以做,但是没有利用递增排序
的条件。
有序数组的问题,可以考虑双指针(即边界指针),或者二分法来做。
双指针
- 时间复杂度 O(N):遍历一遍数组
- 空间复杂度 O(1):使用常量级空间
一个指向数组开始,一个指向数组结尾。
>target 则右边界收缩
<target 则左边界右移
=target 则返回当前指向的两个元素
找不到值,返回空数组
class Solution {
public int[] twoSum(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while(l < r){
int n = nums[l] + nums[r];
if (n > target) r--;
else if (n < target) l++;
else return new int[]{nums[l], nums[r]};
}
return new int[0];
}
}