- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,保存他们的下标。
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
首先,这是一个有序的递增数组。从头到尾,首尾相加,求是否大于求和的值,然后进行调整。如果小于了左边可以右移,大于S的话右边界左移。
#include <iostream>
#include <vector>
using namespace std;
//找出所有和为定值的数的下标 从1计数
vector< pair<int,int>> getSumNum(vector<int> &arr,int Sum)
{
vector<pair<int,int>> vec;
int i,j;
int len = arr.size()-1;
for(i = 0, j = len; i < j ;)
{
if(arr[i] + arr[j] == Sum){
vec.push_back(make_pair(i+1,j+1));
i++;
j--;
}
else if(arr[i] + arr[j] < Sum)
i++;
else
j--;
}
return vec;
}
//找乘积最小就是第一个,如果是乘积最大就求中位数的两个值比较一下就OK啦
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<pair<int,int>> temp = getSumNum(array,sum);
vector<int> result;
result.push_back(array[temp[0].first-1]);//从0计数
result.push_back(array[temp[0].second-1]);
return result;
}
int main(){
vector<int> n={1,2,4,5,7,9,11};
vector<pair<int,int>> temp = getSumNum(n,9);
for(auto t:temp){
cout<<t.first<<" "<<t.second<<endl;
}
vector<int> tp = FindNumbersWithSum(n,9);
for(auto t:tp){
cout<<t<<endl;
}
}