题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
解题思路:
1、设置两个下标(也可以是两个指针)i,j,i从0开始逐渐增大,j从数组最后一个元素的下标开始,逐渐减小;计算这两个下标对应的数组元素a[i],a[j]的和sum,并将这个和与S进行比较。
2、如果sum==s,那么成功找到一对数字,这对数字的和等于s。然后让i++,j--。
3、如果sum > s,由于数组是排好序的且递增,那么就让下标j减1(下标j-1对应的数组元素的值不大于下标j对应的数组元素,这会使前后这两个数组元素的和变小),再重新计算和。
4、如果sum < s,那就让下标i增加1。重新计算两元素的和。
5、直至i >= j
c++代码
vector<int> FindNumbersWithSum(vector<int> array,int sum) {//输入数组array,求两元素和为sum的元素,且这两个元素的成绩最小 vector<int> ivec; if (array.size() == 0){ return ivec; } int left = 0; int right = array.size() - 1; int minMul = 0x7fffffff; int tempMul = 0; while (left < right){ if (array[left] + array[right] == sum){ tempMul = array[left] * array[right]; if (tempMul < minMul){ minMul = tempMul; if (ivec.empty()){ ivec.push_back(array[left]); ivec.push_back(array[right]); } else { ivec[0] = array[left]; ivec[1] = array[right]; } } left++; right--; } else if (array[left] + array[right] < sum){ left++; } else { right--; } } return ivec; }