題目描述:
輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
輸出描述:
對應每個測試案例,輸出兩個數,小的先輸出。
思路:遍歷數組,先找到第一個數,然後再在數組中找另外一個數。設置一個全局乘積最小值變量用來記錄乘積最小的兩個數字。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if(array.empty())
return {};
int multiMin=INT_MAX;
vector<int> res;
for(int i=0;i<array.size();i++){
int data1=array[i];
vector<int>::iterator it=find(array.begin(),array.end(),sum-data1);
if(it!=array.end()){
if(data1*(*it)<multiMin){
res.clear();
res.push_back(data1);
res.push_back(*it);
multiMin=data1*(*it);
}
}
}
return res;
}
};
思路2:採用雙指針法
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if(array.empty())
return {};
int left=0;
int right=array.size()-1;
int multiMin=INT_MAX;
vector<int> res;
while(left<right){
long long cur=array[left]+array[right];
if(cur==sum){
if(array[left]*array[right]<multiMin){
multiMin=array[left]*array[right];
res.clear();
res.push_back(array[left]);
res.push_back(array[right]);
}
//此情況left和right同時發生變化
left++;
right--;
}else if(cur<sum){
left++;
}else{
right--;
}
}
return res;
}
};