和为S的两个数字

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

输出描述:

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


思路: 定义两个指针,一个在最左边,一个在最右边,让后两个指针向中间靠拢
当两个数的和大于S则右边的向左走,
当两个数的和小于S则左边的向右走
当两个数的和等于S就是要求得数,
不要被乘积最小迷惑了,因为递增数组,最小的乘积是左边的乘最右边的比如 1*9 和2*8

//思路:用两个指针,头尾指针向中间靠拢,
//当两数之和大于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;
    }
};

 

 
posted @ 2020-03-18 17:30  Lucky&  阅读(122)  评论(0编辑  收藏  举报
//返回顶部开始
//返回顶部结束