interview: A+B+C = D

给定一个vector<int>, 求里面的数A, B, C, D使得A+B+C=D. 

这里有两个可能,A, B, C是递增或非递增的。这里假设是递增的,而且不能由dulplicate result

 1 #include <iostream>

 2 #include <set>

 3 #include <vector>

 4 #include <algorithm>

 5 #include <map>

 6 using namespace std;

 7 

 8 bool check(pair<int, int> s, int a, int b) {

 9     if (a == s.first || a == s.second || b == s.first || b == s.second) return false;

10     if (a > s.first && a > s.second) return true;

11     else return false;

12 }

13 

14 vector<vector<int> > foursum(vector<int> &num) {

15     map<int, vector<pair<int, int> > > S;

16     sort(num.begin(), num.end());

17     for (int i = 0; i < num.size()-1; i++) {

18         if (i > 0 && num[i] == num[i-1]) continue;

19         for (int j = i+1; j < num.size(); j++) {

20             if (j > i+1 && num[j] == num[j-1]) continue;

21             S[num[i] + num[j]].push_back(make_pair(i, j));

22         }

23     }

24     /*for (map<int, vector<pair<int, int> > >::iterator it = S.begin(); it != S.end(); it++) {

25         for (int i = 0; i < it->second.size(); i++) {

26             cout << it->first << " " << num[(it->second)[i].first] << " " << num[(it->second)[i].second] << endl;

27         }

28     }*/

29     vector<vector<int> > ans;

30     for (int i = 0; i < num.size()-1; i++) {

31         if (i > 0 && num[i] == num[i-1]) continue;

32         for (int j = i+1; j < num.size(); j++) {

33             if (j > i+1 && num[j] == num[j-1]) continue;

34             int t = num[i] - num[j];

35             if (S.count(t)) {

36                 for (int k = 0; k < S[t].size(); k++) {

37                     if (check(S[t][k], i, j)) {

38                         vector<int> tmp;

39                         tmp.push_back(num[S[t][k].first]);

40                         tmp.push_back(num[S[t][k].second]);

41                         tmp.push_back(num[j]);

42                         tmp.push_back(num[i]);

43                         ans.push_back(tmp);

44                     }

45                 }

46             }

47             if (t == 0) continue;

48             t = -t;

49             if (S.count(t)) {

50                 for (int k = 0; k < S[t].size(); k++) {

51                     if (check(S[t][k], i, j)) {

52                         vector<int> tmp;

53                         tmp.push_back(num[S[t][k].first]);

54                         tmp.push_back(num[S[t][k].second]);

55                         tmp.push_back(num[i]);

56                         tmp.push_back(num[j]);

57                         ans.push_back(tmp);

58                     }

59                 }

60             }

61         }

62     }

63     return ans;

64 }

65 int main() {

66     vector<int> num(8);

67     for (int i = 0; i < num.size(); i++) cin >> num[i];

68     vector<vector<int> > ans = foursum(num);

69     for (int i = 0; i < ans.size(); i++) {

70         for (int j = 0; j < ans[i].size(); j++) {

71             cout << ans[i][j] << " ";

72         }

73         cout << endl;

74     }

75     return 0;

76 }

 

你可能感兴趣的:(interview)