2014-04-29 00:04
题目:给定一个整数数组,找出所有加起来为指定和的数对。
解法1:可以用哈希表保存数组元素,做到O(n)时间的算法。
代码:
1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target. 2 // Use hash to achieve O(n) time complexity. Duplicates pairs are skipped. 3 #include <cstdio> 4 #include <unordered_map> 5 #include <vector> 6 using namespace std; 7 8 int main() 9 { 10 vector<int> v; 11 unordered_map<int, int> um; 12 int n, i; 13 int x, y; 14 int target; 15 16 while (scanf("%d", &n) == 1 && n > 0) { 17 scanf("%d", &target); 18 19 v.resize(n); 20 for (i = 0; i < n; ++i) { 21 scanf("%d", &v[i]); 22 } 23 24 // duplicate pairs are skipped 25 for (i = 0; i < n; ++i) { 26 um[v[i]] = um[v[i]] + 1; 27 } 28 29 unordered_map<int, int>::iterator it, it2; 30 for (it = um.begin(); it != um.end(); ++it) { 31 x = it->first; 32 y = target - x; 33 if (x > y) { 34 continue; 35 } 36 37 --it->second; 38 if ((it2 = um.find(y)) != um.end() && it2->second > 0) { 39 printf("(%d, %d)\n", x, y); 40 } 41 ++it->second; 42 } 43 44 v.clear(); 45 um.clear(); 46 } 47 48 return 0; 49 }
解法2:先将数组排序,然后用两个iterator向中间靠拢进行扫描。总体时间是O(n * log(n))。
代码:
1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target. 2 // O(n * log(n) + n) solution. 3 #include <algorithm> 4 #include <cstdio> 5 #include <vector> 6 using namespace std; 7 8 int main() 9 { 10 vector<int> v; 11 int n, i; 12 int ll, rr; 13 int target; 14 15 while (scanf("%d", &n) == 1 && n > 0) { 16 scanf("%d", &target); 17 18 v.resize(n); 19 for (i = 0; i < n; ++i) { 20 scanf("%d", &v[i]); 21 } 22 sort(v.begin(), v.end()); 23 ll = 0; 24 rr = n - 1; 25 26 int sum; 27 while (ll < rr) { 28 sum = v[ll] + v[rr]; 29 if (sum < target) { 30 while (ll + 1 < rr && v[ll] == v[ll + 1]) { 31 ++ll; 32 } 33 ++ll; 34 } else if (sum > target) { 35 while (rr - 1 > ll && v[rr] == v[rr - 1]) { 36 --rr; 37 } 38 --rr; 39 } else { 40 printf("(%d, %d)\n", v[ll], v[rr]); 41 while (ll + 1 < rr && v[ll] == v[ll + 1]) { 42 ++ll; 43 } 44 ++ll; 45 } 46 } 47 48 v.clear(); 49 } 50 51 return 0; 52 }