题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
解题思路:
笔者在前面刷题系列中写了一个 “ 和为S的连续正数序列 ”,这个问题中采用了双指针的方法,本题中同样可以采用这种方法。
对给定的递增序列,给定两个双指针分别指向数列头和尾,将指针指向的两个数据求和,与S比较:
(1)s1+s2 = S,找到了一组满足条件的数据,返回结果即可;
(2)s1+s2 > S,需要缩小,则s2后移一位继续判断;
(3)s1+s2 < S,需要增大,则s1前移一位继续判断;
为什么按此方法找到的第一组数据就是乘积最小的一组?
假定:s1+s2 = S,s2-s1 = d;则2s1+d = S =》 s1 = (S-d)/2 =》s1*s2 = s1*(s1+d) =