sum 3- 4

来源:互联网 发布:软件开发专业就业方向 编辑:程序博客网 时间:2024/06/07 23:00

3 Sum

vector<vector<int> > threeSum(vector<int> &num){vector<vector<int> > result;if(num.size() < 3)return result;sort(num.begin(),num.end());const int target = 0;auto last = num.end();for(auto a = num.begin(); a < prev(last,2); ++ a)//template <class BidirectionalIterator>                                                    /* bidirectionaliterator prev (bidirectionaliterator it, typename iterator_traits<bidirectionaliterator>::difference_type n = 1);*/{auto b = next(a);auto c = prev(last);while(b < c){if(*a + *b + *c  < target)++ b;else if(*a + *b + *c  > target)-- c;else{vector<int> temp;<span style="white-space:pre"></span>temp.push_back(*a);<span style="white-space:pre"></span>temp.push_back(*b);<span style="white-space:pre"></span>temp.push_back(*c);//他的代码是result.push_back({*a, *b, *c})不知道为什么VS报错,不过我也没见过这样的赋值result.push_back(temp);++ b;-- c;}}}sort(result.begin(), result.end());result.erase(unique(result.begin(), result.end()), result.end());return result;}


3 Sum closest

我想的方法就是三重循环,因为觉得是找最接近的,所以不考虑了,结果timeout,O(N^3);
其实还是一样的道理只是比较gap的值,然后再调整b,c的位置
class Solution {public:    int threeSumClosest(vector<int> &num, int target) {        if(num.size() < 3)return target;sort(num.begin(), num.end());auto last = num.end();int cloSum = 0;int min_gap = INT_MAX;for(auto a = num.begin(); a < prev(last, 2); ++ a){auto b = next(a);auto c = prev(last);while(b < c){const int sum = *a + *b + *c;const int gap = abs(target - sum);if(gap < min_gap){min_gap = gap;cloSum = sum;}if(sum < target)++ b;else-- c;}}return cloSum;    }};


4 Sum


class Solution {public:    vector<vector<int> > fourSum(vector<int> &num, int target) {        vector<vector<int> > result; if(num.size() < 4) return result; sort(num.begin(), num.end()); map<int, vector<pair<int, int> > > twoMap;//不知道有重复元素,重复的和怎么处理,key是和,value是得到和的元素下标的vector for(size_t a = 0; a < num.size()-1 ; ++ a) for(size_t b = a+1; b < num.size(); ++ b) { twoMap[num[a] + num[b]].push_back(pair<int, int>(a, b)); } for(size_t c = 0; c < num.size()-1; ++ c) { for(size_t d = c+1; d < num.size(); ++ d) {const int key = target - num[c] - num[d];if(twoMap.find(key) != twoMap.end()){const auto vecPairs = twoMap[key];for(size_t x = 0 ; x < vecPairs.size(); ++x){if(c > vecPairs[x].second)//不知道,就算计算了两个的和,应该怎么进行选择,一定是a,b位于c,d前面这样,不会有重复,c下标而已<span style="white-space:pre"></span>result.push_back({num[vecPairs[x].first], num[vecPairs[x].second], num[c],num[d]});}} } } sort(result.begin(), result.end()); result.erase(unique(result.begin(), result.end()), result.end()); return result;    }};



0 0