《剑指 offer》 和为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)

代码

function FindNumbersWithSum(array, sum)
{
    // write code here
    let i=0;
    let j=array.length-1;
    let res=[];
    while(i<j){
        let temp=array[i]+array[j];
        if(temp==sum){
            res=[array[i],array[j]];
            break;
        }else if(i<j&&temp>sum){
            j--;
        }else{
            i++;
        }
    }
    return res;
}

   转载规则


《《剑指 offer》 和为s的两个数字》 李冉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
《剑指 offer》 和为s的正整数序列 《剑指 offer》 和为s的正整数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,1
下一篇 
这个博客是怎么来的 这个博客是怎么来的
这个博客是怎么来的效果预览: 做法根据参考文献中的内容,我配置了环境 首先是安装Hexo 在合适的地方新建一个文件夹,用来存放自己的博客文件,比如我的博客文件都存放在D:\study\program\blog目录下。 在该目录下右键点击G
2019-12-14
  目录