• 剑指:和为S的两个数字


    题目描述

    输入一个数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。

    如果有多对数字的和等于s,输出任意一对即可。

    你可以认为每组输入中都至少含有一组满足条件的输出。

    样例

    输入:[1,2,3,4] , sum=7
    
    输出:[3,4]

    解法

    数列满足递增,设两个头尾两个指针i和j,
    若ai + aj == sum,就是答案(相差越远乘积越小)
    若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
    若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
    O(n)
    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> res = new ArrayList<>();
            
            if(array==null || array.length<2){
                return res;
            }
            //左右夹逼
            int i=0, j=array.length-1;
            while(i<j){
                if(array[i] + array[j] == sum){
                    res.add(array[i]);
                    res.add(array[j]);
                    return res;
                }else if(array[i] + array[j] > sum){
                    j--;
                }else{
                    i++;
                }
            }
            return res;
        }
    }

    多组的情况下也自动适合了


    即找到的第一组(相差最大的)就是乘积最小的。可以这样证明:

    考虑x+y=C(C是常数),x*y的大小。

    不妨设y>=x,y-x=d>=0,

    即y=x+d, 2x+d=C, x=(C-d)/2

    x*y=x(x+d)=(C-d)(C+d)/4=(C^2-d^2)/4,

    也就是x*y是一个关于变量d的二次函数,对称轴是y轴,开口向下。

    d是>=0的,d越大, x*y也就越小。

     
  • 相关阅读:
    EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值
    js表单插件
    前端模块化入门
    前端模板引擎
    量化策略研究员
    量化策略研究员
    C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法
    一月5日
    一月5日
    一月5日
  • 原文地址:https://www.cnblogs.com/lisen10/p/11461015.html
Copyright © 2020-2023  润新知