解题思路:双指针
题目给定的条件是数组是按递增排序的
我们可以使用双指针的思路,维护两个指针i
,j
分别维护数组的首和尾
在i < j
的条件范围内,计算nums[i]
与nums[j]
的和sum
sum < target
;说明当前两数之和小于target
,i
指针应该向后移动sum > target
;说明当前两数之和大于target
,j
指针应该向前移动sum == target
;因为题目要求输出任意一对符合条件的结果,所以当sum == target
返回nums[i]
,nums[j]
数组即可
代码如下
代码
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
// 双指针
int i = 0;
int j = nums.length - 1;
while(i < j){
int sum = nums[i] + nums[j];
if(sum < target){
i++;
}else if(sum > target){
j--;
}else{
return new int[]{nums[i],nums[j]};
}
}
return new int[0];
}
}
复杂度分析
- 时间复杂度:O(N)
最差的情况,需要遍历整个数组,所以时间复杂度为:O(N)
- 空间复杂度:O(1)
本题只需要 i,j 两个有限变量,额外空间复杂度为:O(1)