输入一个递增排序的数组和一个数字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]
限制:
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^6
分析:
方法:双指针
因为数组是递增的,所以对于任意两数之和 sum = ai + aj(i < j),令 target = am + an:
- 如果 sum > target,若 i < m,那么 aj > an
- 如果 sum < target,若 j > n,那么 ai < am
所以我们定义双指针分别指向头尾,若两数之和大于 target,尾指针左移,若两数之和小于 target,头指针右移,直到两数之和等于 target 或 头尾指针相等。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public int[] twoSum(int[] nums, int target) {
//定义双指针
int i = 0, j = nums.length - 1;
//遍历
while(i < j){
//两数之和
int sum = nums[i] + nums[j];
//找到两数,直接返回
if(sum == target){
return new int[]{nums[i], nums[j]};
}
//两数之和大于目标数,右指针左移
if(sum > target){
j--;
}
//两数之和小于目标数,左指针右移
else{
i++;
}
}
return new int[0];
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof