输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
我觉得这道题自己应该记录一下,避免以后犯同样的错误。这道题第一次我思路是将每一个符合要求的先用pair装入vector中,代码比较多,在VS上测试用例是通过了的,但是提交的时候说段错误。
代码如下:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
vector<
int
> FindNumbersWithSum(vector<
int
> array,
int
sum) { vector< int > res; vector<pair< int , int > > vec; if (array.size() == 0 ) return res; int Msum = 0 ; int start = 0 , end = array.size() - 1 ; while (start < end) { if (array[start] + array[end] == sum) { vec.push_back(make_pair(array[start] , array[end])); end--; } else if ((array[start] + array[end] > sum) && start < end) { end--; } else if ((array[start] + array[end] < sum) && start < end) { start++; } } sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); if (vec.size() <= 1 ) { res.push_back(vec[ 0 ].first); res.push_back(vec[ 0 ].second); return res; } res.push_back(vec[ 0 ].first); res.push_back(vec[ 0 ].second); for ( int i = 1 ; i < vec.size(); i++) { if (vec[i].first * vec[i].second >= res[ 0 ] * res[ 1 ]) continue ; else { res.clear(); res.push_back(vec[i].first); res.push_back(vec[i].second); } } return res; } |
后面省去了用pair,在开始的时候判断res容器是不是为空,不是的话就判断现在即将压入的数与之前存在于容器内的数的乘积大小,直到遍历完毕。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//超时代码 vector< int > FindNumbersWithSum(vector< int > array, int sum) { vector< int > res; if (array.size() == 0 ) return res; int start = 0 , end = array.size() - 1 ; long long s = 0 ; while (start < end) { long long Msum = array[start] + array[end]; if (Msum == sum) { if (res.size() == 0 ) { res.push_back(array[start]); res.push_back(array[end]); s = array[start] * array[end]; } else if (res.size() != 0 && array[start] * array[end] > s) continue ; else if (res.size() != 0 && array[start] * array[end] < s) { res.clear(); res.push_back(array[start]); res.push_back(array[end]); s = array[start] * array[end]; } end--; } else if ((Msum > sum) && start < end) { end--; } else if ((array[start] + array[end] < sum) && start < end) { start++; } } return res; } |
代码超时。。。
冷静下来仔细想了一下,这是一个递增排序的数组,其实只要最前面和最后面出现的数字一旦相加为sum,出现的第一对一定是乘积最小的。
修改代码如下:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
vector<
int
> FindNumbersWithSum(vector<
int
> array,
int
sum) { vector< int > res; if (array.size() == 0 ) return res; int start = 0 , end = array.size() - 1 ; while (start < end) { long long Msum = array[start] + array[end]; long long s = 0 ; if (Msum == sum) { res.push_back(array[start]); res.push_back(array[end]); break ; } else if ((Msum > sum) && start < end) { end--; } else if ((array[start] + array[end] < sum) && start < end) { start++; } } return res; } |
准确通过。下次一定记得不要着急,仔细分析题目。