[剑指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 };
原文地址:https://www.cnblogs.com/lca1826/p/6520188.html