输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的

剑指Offer两数之和为S题解

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的

思路:

//思路:用两个指针,头尾指针向中间靠拢,
//当两数之和大于S时,说明最大值太大了(数组是递增的),所以右指针向左移动
//两数之和小于S时,说明太小了,左指针向右移动
//两数之和等于S就是所要求的
//乘积最小使迷惑的,当第一个符合条件就是最小的
#include <iostream>
#include <vector>
using namespace std;

//输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,
//如果有多对数字的和等于S,输出两个数的乘积最小的

//思路:用两个指针,头尾指针向中间靠拢,
//当两数之和大于S时,说明最大值太大了(数组是递增的),所以右指针向左移动
//两数之和小于S时,说明太小了,左指针向右移动
//两数之和等于S就是所要求的
//乘积最小使迷惑的,当第一个符合条件就是最小的
class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> result;

        int left = 0, right = array.size()-1;  // 双指针
        while(left < right)
        {
            if (array[left]+array[right] == sum)
            {
                result.push_back(array[left]);
                result.push_back(array[right]);
                break;
            }
            else if(array[left]+array[right] > sum) // 说明右边的太大,
                right--;
            else
                left++;
        }
        return result;
    }
};

int main()
{
    vector<int> nums={1,2,3,4,5,6,7,8};
    Solution s;
    vector<int> vec = s.FindNumbersWithSum(nums,9);
    cout << vec[0] << " " << vec[1];

    return 0;
}
原文地址:https://www.cnblogs.com/xiaokang01/p/12365704.html