码迷,mamicode.com
首页 > 其他好文 > 详细

剑指 Offer 57. 和为s的两个数字

时间:2021-02-15 12:36:24      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:二分查找   二分   while   public   ==   一个   pair   个数   和为s的两个数字   

题意

在一个有序数组里找两个和为s的数字

思路

  • 1??有序,立刻联想到二分查找,我们可以依次遍历数组中的每个数字,然后二分查找另一个数字使得和可以为s。
  • 2??双指针的写法
    • 一开始分别放在最左和最右,对应为最小和最大的数字,记两个指针指向的元素的和为sum
    • 如果sum > target,说明太大,则右边的指针应该往左走
    • 如果sum < target,说明太小,则左边的指针应该往右走

代码(二分查找)

class Solution {
public:
    int find_pair(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target) {
                return mid;
            }else if(nums[mid] > target) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return -1;
    }
    vector<int> twoSum(vector<int>& nums, int target) {
        for(auto n: nums) {
            int p = find_pair(nums, target - n);
            if(p != -1) {
                return {n, nums[p]};
            }
        }
        return {};
    }
};

代码(双指针法)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int cur1 = 0, cur2 = nums.size() - 1;
        while(cur1 != cur2) {
            int sum = nums[cur1] + nums[cur2];
            if(sum == target) {
                return {nums[cur1], nums[cur2]};
            }else if(sum > target) {
                cur2--;
            }else {
                cur1++;
            }
        }
        return {};
    }
};

剑指 Offer 57. 和为s的两个数字

标签:二分查找   二分   while   public   ==   一个   pair   个数   和为s的两个数字   

原文地址:https://www.cnblogs.com/MartinLwx/p/14398053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!