题目描述

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

输出描述:

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

代码:

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> result;
        if (array.size() <2)
            return result;
        int left=0, right=array.size()-1;
        int num_a, num_b, product=array[right] * array[right];
        bool valid = false;
        
        while(left < right) {
            if(array[left] + array[right] < sum) {
                left++;
            }else if(array[left] + array[right] > sum) {
                right--;
            } else if(array[left] + array[right] == sum && array[left] * array[right] < product) {
                num_a = array[left];
                num_b = array[right];
                product = array[left] * array[right];
                valid = true;
                right--;
            } else {
                break;
            }
        }
        if (valid) {
            result.push_back(num_a);
            result.push_back(num_b);
        }
        
        return result;
    }
};

和快排思想类似,就是同时从前往后和从后往前遍历.注意上述代码有个风险是两个数的乘积会不会过大.

相关文章:

  • 2021-08-17
  • 2021-06-13
  • 2022-01-17
  • 2022-12-23
  • 2021-11-15
  • 2021-04-28
  • 2021-11-26
  • 2021-08-20
猜你喜欢
  • 2021-06-29
  • 2021-11-14
  • 2021-09-30
  • 2022-03-01
  • 2022-03-10
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案