zoukankan      html  css  js  c++  java
  • 5-剑指offer: 和为S的两个数字

    题目描述

    输入一个递增排序的数组和一个数字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;
        }
    };
    

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

  • 相关阅读:
    git 账号密码
    sql server 备份
    计算经纬度的两点之间的距离
    redis 安装
    webapi 可空参数
    Asp.Net MVC4 使用Unity 实现依赖注入
    sublime主题推荐
    分解质数因子
    如何在sublime+chrome中调试php代码?
    php的mysql语句里变量加不加单引号问题
  • 原文地址:https://www.cnblogs.com/xl2432/p/10877682.html
Copyright © 2011-2022 走看看