❓ 剑指 Offer 57. 和为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]
限制:
- 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
- 1 < = n u m s [ i ] < = 1 0 6 1 <= nums[i] <= 10^6 1<=nums[i]<=106
💡思路:双指针
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
- 如果两个指针指向元素的和
sum == target
,那么这两个元素即为所求; - 如果
sum < target
,移动较小的元素i++
,使sum
变大一些; - 如果
sum > target
,移动较大的元素j--
,使sum
变小一些。
🍁代码:(C++、Java)
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0, j = nums.size() - 1; i < j;){
int sum = nums[i] + nums[j];
if(sum == target) return {nums[i], nums[j]};
else if(sum < target) i++;
else j--;
}
return {};
}
};
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0, j = nums.length - 1; i < j;){
int sum = nums[i] + nums[j];
if(sum == target) return new int[]{nums[i], nums[j]};
else if(sum < target) i++;
else j--;
}
return new int[2];
}
}
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
为数组的长度。 - 空间复杂度: O ( 1 ) O(1) O(1)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!