和为S的两个数字★★

题目描述

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

 

解题思路:

遍历数组,二分找另一个数字。跟《和为S的连续正数序列》基本类似。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int>res;
        int n = array.size();
        int a, b;
        int vmin = 0xfffffff;
        for(int i = 0; i < n; i++){
            int l = i+1;
            int r = n-1;
            int mid = (l+r)/2;
            while(l <= r){
                mid = (l+r)/2;
                if(array[mid] < sum-array[i]){
                    l = mid+1;
                }else if(array[mid] > sum-array[i]){
                    r = mid -1;
                }else{
                    if(array[i]*array[mid] < vmin){
                        a = array[i];
                        b = array[mid];
                        vmin = array[i]*array[mid];
                    }
                    break;
                }
            }
        }
        if(vmin == 0xfffffff) return res;
        res.push_back(a);
        res.push_back(b);
        return res;
    }
};

  

 

posted @ 2019-04-10 17:19  tcgoshawk  阅读(119)  评论(0编辑  收藏  举报