[剑指Offer] 42.和为S的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
【思路】同LeetCode中的Two Sum类似,但由于要将乘积最小的一组输出,因此需要一个辅助函数Sift来将不符合条件的删除。
1 class Solution 2 { 3 public: 4 void Sift(vector<int> &vec) 5 { 6 int minid = 0; 7 int num = vec.size(); 8 vector<int> multi(num/2); 9 for(int i = 0,j = 0; i < num; i = i + 2,j ++) 10 { 11 multi[j] = vec[i]*vec[i+1]; 12 } 13 for(int i = 1; i < num/2; i ++) 14 { 15 if(multi[minid] > multi[i]) 16 { 17 vec[minid*2] = vec[minid*2+1] = -1; 18 minid = i; 19 } 20 else 21 { 22 vec[i*2] = vec[i*2+1] = -1; 23 } 24 } 25 for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ) 26 { 27 if (*iter == -1) 28 { 29 if (++iter == vec.end()) 30 { 31 vec.erase(--iter); 32 break; 33 } 34 else iter = vec.erase(--iter); 35 } 36 else 37 ++iter; 38 } 39 } 40 41 vector<int> FindNumbersWithSum(vector<int> array,int sum) 42 { 43 vector<int> res; 44 if(array.size() < 2) return res; 45 int target = 0; 46 vector<int> temp; 47 for(int i = 0; i < array.size(); i ++) 48 { 49 target = sum - array[i]; 50 if(find(temp.begin(),temp.end(),target) != temp.end()) 51 { 52 res.push_back(target); 53 res.push_back(array[i]); 54 } 55 else 56 { 57 temp.push_back(array[i]); 58 } 59 } 60 Sift(res); 61 return res; 62 } 63 };