题目描述
输入一个递增排序的数组和一个数字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;
}
本文介绍了一种算法,用于在已排序的递增数组中找到两个数,使得它们的和等于给定的目标值,并输出乘积最小的数对。算法通过双指针技巧实现,效率较高。
9727

被折叠的 条评论
为什么被折叠?



