167. 两数之和 II - 输入有序数组
题目链接: 189. 轮转数组
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示:
- 2 < = n u m s . l e n g t h < = 3 ∗ 1 0 4 2 <= nums.length <= 3*10^{4} 2<=nums.length<=3∗104
- − 1000 < = n u m s [ i ] < = 1000 -1000 <= nums[i] <= 1000 −1000<=nums[i]<=1000
- n u m b e r s 按 非 递 减 顺 序 排 列 numbers 按 非递减顺序 排列 numbers按非递减顺序排列
- − 1000 < = t a r g e t < = 1000 -1000 <= target <= 1000 −1000<=target<=1000
- 仅 存 在 一 个 有 效 答 案 仅存在一个有效答案 仅存在一个有效答案
注:
看到数据范围肯定 O ( n 2 ) O(n^{2}) O(n2)暴力肯定不行,一开始看到标签有个二分,写了半天二分,最后发现其实用双指针贪心就可以。。。
题解:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
// int p1,p2;
// p1=0;
// p2=-1;
// int n=numbers.size();
// if(numbers[n-1]+numbers[n-2]==target){
// vector<int> res;
// res.push_back(n-1);
// res.push_back(n);
// return res;
// }
// while(p1<n&&p2<n){
// // if(a>target||p2==n-1){
// // p1++;
// // p2=p1+1;
// // }
// // else p2++;
// int c=target-numbers[p1];
// p2=bsearch(numbers,p1+1, c);
// //cout<<p1<<" "<<p2<<" "<<c<<endl;
// if(p2!=-1)break;
// else p1++;
// //i++;
// }
// vector<int> res;
// res.push_back(p1+1);
// res.push_back(p2+1);
// return res;脑子不好写了半天二分。。。虽然二分也能过。。。
int p1,p2;
p1=0;
int n=numbers.size();
p2=n-1;
int a=numbers[p1]+numbers[p2];
while(a!=target){
if(a>target)p2--;
else if(a<target)p1++;
a=numbers[p1]+numbers[p2];
}
vector<int> res;
res.push_back(p1+1);
res.push_back(p2+1);
return res;
}
//二分搜索
// int bsearch(vector<int>& nums, int st, int target){
// int r=nums.size();//4
// int l=st;//3
// int mid=(r+l)/2;//2
// while(l<=r){
// if(nums[mid]==target)
// return mid;
// else if(mid==0) return -1;
// if(nums[mid]>target){
// r=mid-1;
// mid=(r+l)/2;
// }
// else if(nums[mid]<target){
// l=mid+1;
// mid=(r+l)/2;
// }
// }
// return -1;
// }
};