刷着玩-LeetCode20天算法-167. 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组

题目链接: 189. 轮转数组
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例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<=3104
  • − 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;
    // }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值