Practice32:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
S1
暴力解
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
if(array.empty())return res;
int size = array.size();
for(int l=0;l<size-1;++l){
for(int r=size-1;r>l;--r){
int mid_sum = array[l]+array[r];
if(mid_sum==sum){
res.push_back(array[l]);
res.push_back(array[r]);
}
else if(mid_sum<sum){
break;
}
}
}
if(res.empty())return res;
int s_min = res[0]*res[1];
int min_num = 0;
for(int i=1;i<res.size()/2;++i){
if(s_min>res[i*2]*res[i*2+1]){
s_min = res[i*2]*res[i*2+1];
min_num = i;
}
}
return {res[min_num*2],res[min_num*2+1]};
}
};
S2
牛客解题之一
使用map
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if (array.empty()) return vector<int>();
int tmp = INT_MAX;
pair<int, int> ret;
unordered_map<int,int> mp;
for (int i=0; i<array.size(); ++i) {
mp[array[i]] = i;
}
for (int i=0; i<array.size(); ++i) {
if (mp.find(sum-array[i]) != mp.end()) {
int j = mp[sum-array[i]];
if ( j > i && array[i]*array[j] < tmp) {
tmp = array[i] * array[j];
ret = {i, j};
}
}
}
if (ret.first == ret.second) return vector<int>();
return vector<int>({array[ret.first], array[ret.second]});
}
};
S3
牛客解题之二
双指针法
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if (array.empty()) return vector<int>();
int tmp = INT_MAX;
pair<int, int> ret;
int i = 0, j = array.size();
while (i < j) {
if (array[i] + array[j-1] == sum) {
if (array[i]*array[j-1] < tmp) {
tmp = array[i] * array[j-1];
ret = {i, j-1};
}
++i, --j;
}
else if (array[i] + array[j-1] < sum) {
++i;
}
else {
--j;
}
}
if (ret.first == ret.second) return vector<int>();
return vector<int>({array[ret.first], array[ret.second]});
}
};