• 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),难点在于如何去重。写代码之前在纸上想清楚再写。

  • 相关阅读:
    发送短信/邮件/打电话 code(转)
    如何学习算法
    堆和栈的区别
    2010 baidu笔试
    关于TableView中图片的延时加载(转)
    sqlite + UITableView 实现iPhone大数据浏览
    2010 Google中国笔试试题
    海量数据处理方法总结(转)
    IPhone WebApp 设计开发工具与资源(转)
    DynamicDataSet
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/12920289.html
Copyright © 2020-2023  润新知