和为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 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^6
题目分析
关键词:递增排序
要求:输出两个数,target=num1+num2
递增
- 可以考虑直接遍历,抵达某一数停止 ×超时
- 可以考虑二分法
假设第i个数为a,target-a=find
find就是你要找到的那一个数
可以稍稍简化,
-
if(nums[0]>=target) return two; for(k=nums.size()-1;;k--){ if(nums[k]<target){ right=k;break; } }
-
for(int i=0;**nums[i]<num**;i++) 其中,num的初值为:num=target 在循环中num=target-nums[i];
代码
- 直接遍历,超时
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// vector<int> twonums;int i=0,j;
// while(i<nums.size() && target-nums[i]>=0){
// j=i+1;
// while(j<nums.size()&&target-nums[j]-nums[i]>=0){
// if(nums[i]+nums[j]==target){
// twonums.push_back(nums[i]);
// twonums.push_back(nums[j]);
// return twonums;
// }
// j++;
// }
// i++;
// }
// return twonums;
vector<int> twonums;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]>=target) break;
if(nums[i]+nums[i]==target){
twonums.push_back(nums[i]);
twonums.push_back(nums[i]);
return twonums;
}
for(int j=i+1;j<nums.size();j++){
if(nums[j]>target-nums[i]){
break;
}
if(nums[i]+nums[j]==target){
twonums.push_back(nums[i]);
twonums.push_back(nums[j]);
return twonums;
}
}
}
return twonums;
}
};
- 二分法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> two;int left,right,num=target,mid,k;
if(nums[0]>=target) return two;
for(k=nums.size()-1;;k--){
if(nums[k]<target){
right=k;break;
}
}
for(int i=0;nums[i]<num;i++){
left=i+1;right=k;
num=target-nums[i];
while(left<=right){
mid = (left+right)/2;
if(num == nums[mid]){
two.push_back(nums[mid]);
two.push_back(nums[i]);
return two;
}
else if(num > nums[mid]){
left=mid+1;
}
else{
right=mid-1;
}
}
}
return two;
}
};