zoukankan      html  css  js  c++  java
  • 和为S的两个数字

    题目描述

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

    输出描述:

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



    提交链接:点击




    思路:

     用左右两个指针来进行判断。设两个头尾两个指针i和j,
        若ai + aj == sum,就是答案(相差越远乘积越小)
        若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
        若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
             时间复杂度为O(n)
      证明:
        假设:找到两组满足条件的数组对(x,y)、(x+a,y-a),其中(x+y=S, 0<a<y-x)
         * x*y-[(x+a)(y-a)]
         *  =x*y-x*y-(y-x)a+a2
         *  =a[a-(y-x)]
         *  因为0<a<y-x,所以a-(y-x)<0,所以a[a-(y-x)]<0
         *  因此(x,y)乘积一定比(x+a,y-a)小

      

    代码:

    class Solution {
    public:
        vector<int> FindNumbersWithSum(vector<int> array,int sum) {
            int i=0,j=array.size()-1;
            vector<int> result;
            while(i<j){
                if(array[i]+array[j]==sum) {  //必是最小的
                    result.push_back(array[i]);
                    result.push_back(array[j]);
                    break;
                }else if(array[i]+array[j]<sum){
                    i++;
                }else{
                    j--;
                }
            }
            return result;
        }
    };


  • 相关阅读:
    获取与端点的连接
    判断div内滚动条是否在底部
    MVC的使用!
    格式转换解决存取数据安全问题
    JQuery input file 上传图片
    contenteditable 常用的一些CSS !!
    C# 生成Json类型数据
    生成Excel
    生成验证码
    图片水印
  • 原文地址:https://www.cnblogs.com/logo-88/p/9900864.html
Copyright © 2011-2022 走看看