lc 三数之和

链接: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;
    }
};
WRONG
#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;
    }
};
View Code

思路:WRONG 想的是 n*n*logn,如果写出来估计会超时,难点在于如何去重,unique,resize 过后超时掉了

   View Code 是看题解的双指针,两数之和是 O(n) , 三数之和是 O(n*n),难点在于如何去重。写代码之前在纸上想清楚再写。

posted on 2020-05-19 23:06  FriskyPuppy  阅读(160)  评论(0编辑  收藏  举报

导航