先说结论:数组算法题目,一看到题就想把每个元素遍历一次的,甚至还要嵌套着遍历的,肯定不是最优解!!!
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
又是神一样的解题思路:
拿到这个题目,首先想的其实还是最中庸的思路,也是肯定非最优解的思路:先用第一个数来遍历数组,看有没有和为s的,再看看第二个数...
在牛客看到的大神的解法:
链接:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b来源:牛客网
数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 O(n)细细一想,确实这样的!代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution { public : vector< int > FindNumbersWithSum(vector< int > array, int sum) { int i = 0; int 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 ) j--; else i++; } return result; } };