- 輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字S,在數(shù)組中查找兩個(gè)數(shù),使得他們的和正好是S,如果有多對(duì)數(shù)字的和等于S,保存他們的下標(biāo)。
- 輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字S,在數(shù)組中查找兩個(gè)數(shù),使得他們的和正好是S,如果有多對(duì)數(shù)字的和等于S,輸出兩個(gè)數(shù)的乘積最小的。
首先,這是一個(gè)有序的遞增數(shù)組。從頭到尾,首尾相加,求是否大于求和的值,然后進(jìn)行調(diào)整。如果小于了左邊可以右移,大于S的話右邊界左移。
#include <iostream>
#include <vector>
using namespace std;
//找出所有和為定值的數(shù)的下標(biāo) 從1計(jì)數(shù)
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;
}
//找乘積最小就是第一個(gè),如果是乘積最大就求中位數(shù)的兩個(gè)值比較一下就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計(jì)數(shù)
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;
}
}