剑指offer:和为S的两个数字
Posted zhangxiaoyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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)
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list = new ArrayList<Integer>(2); if(array==null||array.length==1) return list; int begin = 0; int end = array.length-1; while(begin<end){ if(array[begin]+array[end]==sum){ list.add(array[begin]); list.add(array[end]); break; }else if(array[begin]+array[end]>sum){ end--; }else if(array[begin]+array[end]<sum){ begin++; } } return list; }
以上是关于剑指offer:和为S的两个数字的主要内容,如果未能解决你的问题,请参考以下文章
[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列