链接:https://leetcode-cn.com/problems/3sum/
代码:
#include <vector> #include <iterator> #include <algorithm> using namespace std; class Solution { public: static bool mycompare(vector<int> v1, vector<int> v2) { vector<int>::iterator it1 = v1.begin(), it2 = v2.begin(); for(; it1 != v1.end() && it2 != v2.end(); it1++, it2++) { if(*it1 <= *it2) return true; if(*it1 > *it2) return false; } return true; } static bool myfunc(vector<int> v1, vector<int> v2) { if(v1.size() != v2.size()) return false; vector<int>::iterator it1 = v1.begin(), it2 = v2.begin(); for(; it1 != v1.end() && it2 != v2.end(); it1++, it2++) { if(*it1 != *it2) return false; cout << "----" << endl; } cout << "true" << endl; return true; } vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end()); // debug for(vector<int>::const_iterator i = nums.begin(); i != nums.end(); i++) { cout << *i << " "; } cout << endl; vector<vector<int>> res; for(vector<int>::iterator i = nums.begin(); i != nums.end(); i++) { for(vector<int>::iterator j = i+1; j != nums.end(); j++) { if(j+1 != nums.end() && binary_search(j+1, nums.end(), -(*i+*j))) { // bebug cout << -(*i+*j) << endl; vector<int> temp; temp.push_back(*i); temp.push_back(*j); temp.push_back(-(*i+*j)); if(!find(res.begin(), res.end(), temp)) res.push_back(temp); } } } // vector<int> t1, t2; // for(int i = -1; i <= 1; i++) { // t1.push_back(i-1); // t2.push_back(i); // } // cout << "------" << endl; // cout << myfunc(t1, t2) << endl; // cout << "------" << endl; // vector<int>::iterator it; // vector<int> t1; // for(int i = 0; i <= 5; i++) { // t1.push_back(i); // } // t1.push_back(5); // for(it = t1.begin(); it != t1.end(); it++) { // cout << *it << " "; // } // cout << endl; // it = unique(t1.begin(), t1.end()); // t1.resize(distance(t1.begin(), it)); // for(it = t1.begin(); it != t1.end(); it++) { // cout << *it << " "; // } // cout << endl; sort(res.begin(), res.end(), mycompare); vector<vector<int>>::iterator it; it = unique(res.begin(), res.end(), myfunc); res.resize(distance(res.begin(), it)); return res; } };
#include <vector> #include <iterator> #include <algorithm> using namespace std; class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end()); // debug // for(vector<int>::const_iterator i = nums.begin(); i != nums.end(); i++) { // cout << *i << " "; // } // cout << endl; vector<vector<int>> res; if(nums.size() < 3) return res; int len = nums.size(); // cout << len << endl; for(int i = 0; i < len-2; i++) { if(nums[i] > 0) break; if(i > 0 && nums[i] == nums[i-1]) continue; int L = i+1; int R = len-1; // cout << "+++" << endl; while(L < R) { int sum = nums[i] + nums[L] + nums[R]; // cout << sum << endl; if(sum == 0) { vector<int> temp; temp.push_back(nums[i]); temp.push_back(nums[L]); temp.push_back(nums[R]); res.push_back(temp); while(L < R && nums[R-1] == nums[R]) R--; while(L < R && nums[L] == nums[L+1]) L++; L++, R--; } else if(sum < 0) { L++; // while(L < R && nums[L] == nums[L+1]) L++; } else { R--; // while(L < R && nums[R-1] == nums[R]) R--; } } } return res; } };
思路:WRONG 想的是 n*n*logn,如果写出来估计会超时,难点在于如何去重,unique,resize 过后超时掉了
View Code 是看题解的双指针,两数之和是 O(n) , 三数之和是 O(n*n),难点在于如何去重。写代码之前在纸上想清楚再写。