3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)tags: array, two pointers
老规矩,先暴力搜,看看能不能过。
n^3复杂度,倒不是超时,而是输出超界(OUTPUT LIMIT EXCEEDED)。看来原数组中有很多重复数字,导致我产生了过多的重复解(duplicate),尝试优化中。
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int>> re; for(vector<int>::iterator it1 = num.begin(); it1 != num.end(); it1++){ for(vector<int>::iterator it2 = it1; it2 != num.end(); it2++){ for(vector<int>::iterator it3 = it2; it3 != num.end(); it3++){ if(*it1 + * it2 + *it3 == 0){ vector<int> thisRe; thisRe.push_back(*it1); thisRe.push_back(*it2); thisRe.push_back(*it3); sort(thisRe.begin(), thisRe.end()); re.push_back(thisRe); } } } } return re; } };
2.2更新
利用一个哈希表,储存个元素出现的次数,将复杂度降到n^2。对原始序列进行排序,谨慎地控制指针的移动从而避免出现重复解。
需要注意解集中出现的重复数字,比如(2,2,-4)这样,先要判断提供的序列中元素的个数是否足够,然后再压入返回值中。
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int>> re; unordered_map<int, int> m; if(num.empty() == true || num.size() < 3){ return re; } sort(num.begin(), num.end()); for(vector<int>::iterator it = num.begin(); it != num.end(); it++){ if(m.find(*it) == m.end()){ m[*it] = 1; } else{ m[*it]++; } } vector<int>::iterator it1 = num.begin(); while(it1!= num.end()){ vector<int>::iterator it2 = it1 + 1; while(it2 != num.end()){ int a = *it1; int b = *it2; int target = 0 - a - b; if(target < b){//repeated possible result break; } else if(m.find(target) != m.end()){//found int count = m[target]; if((a == b && a == target && count < 3) || ((target == b) && count < 2)){ //not enough num ; } else{ vector<int> thisRe; thisRe.push_back(a); thisRe.push_back(b); thisRe.push_back(target); re.push_back(thisRe); } } it2++; while(*it2 == *(it2-1) && it2 != num.end()){ it2++; } } /*move it1 */ it1++; while(*it1 == *(it1 - 1) && it1 != num.end()){ it1++; } } return re; } };