zoukankan      html  css  js  c++  java
  • Leetcode 4Sum

    先来一个暴力解:

    class Solution {
    public:
        vector<vector<int> > fourSum(vector<int> &num, int target) {
            vector<vector<int> > res;
            vector<int> r;
            r.resize(4);
            sort(num.begin(), num.end());
    
            int len = num.size();
            for (int i=0; i<len; i++) {
                if (i!=0 && num[i] == num[i-1]) continue;   // skip dup
                for (int j=i+1; j<len; j++) {
                    int psum = num[i] + num[j];
                    if (num[j] >= 0 && psum > target) break;
                    if (j!=i+1 && num[j] == num[j-1]) continue; // skip dup
                    r[0] = num[i], r[1] = num[j];
                    
                    int ptarget = target - psum;
    
                    int p = j+1;
                    int q = len - 1;
                    while (p < q) {
                        if (num[p] >= 0 && num[p] > ptarget) break;
                        if (num[q] < 0 && num[q] < ptarget) break;
                        if (p != j+1 && num[p] == num[p-1]) {   // skip dup
                            p++;
                            continue;
                        }
                        if (q != len-1 && num[q] == num[q+1]) { // skip dup
                            q--;
                            continue;
                        }
                        int s = num[p] + num[q];
                        if (s < ptarget) {
                            p++;
                        } else if (s > ptarget) {
                            q--;
                        } else {
                            r[2] = num[p];
                            r[3] = num[q];
                            res.push_back(r);
                            p++, q--;
                        }
                    }
                }
            }
            return res;
        }
    };

    有些快速跳出的语句加了反而更慢。

    第二轮:

    Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

    Note:

    • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
    • The solution set must not contain duplicate quadruplets.
        For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
    
        A solution set is:
        (-1,  0, 0, 1)
        (-2, -1, 1, 2)
        (-2,  0, 0, 2)
    class Solution {
    public:
        vector<vector<int> > fourSum(vector<int> &num, int target) {
            sort(num.begin(), num.end());
            
            vector<vector<int> > res;
            int len = num.size();
            if (len < 4) {
                res;
            }
            
            for (int i=0; i<len; i++) {
                if (i!=0 && num[i] == num[i-1]) continue;
                for (int j=i+1; j<len; j++) {
                    if (j!=i+1 && num[j] == num[j-1]) continue; 
                    int p = j+1;
                    int q = len -1;
                    int rest = target - num[i] - num[j];
                    
                    while (p < q) {
                        int t = num[p] + num[q];
                        if (t == rest) {
                            if (!res.empty() 
                                && res.back()[0] == num[i] 
                                && res.back()[1] == num[j] 
                                && res.back()[2] == num[p]
                                && res.back()[3] == num[q]) {
                            } else {
                                res.push_back(vector<int>({num[i], num[j], num[p], num[q]}));
                            }
                            p++;
                        } else if (t > rest) {
                            q--;
                        } else {
                            p++;
                        }
                    }
                }
            }
            return res;
        }
    };
  • 相关阅读:
    条款04:确定对象在使用前已经被初始化
    条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
    计算机操作系统之死锁的原因和必要条件
    条款10:令operator=返回一个reference to *this
    条款02:尽量以const,enum,inline代替#define
    条款11:在operator=处理自我赋值
    计算机操作系统之进程与线程
    堆排序
    NodeJS For Windows
    我常用的linux命令
  • 原文地址:https://www.cnblogs.com/lailailai/p/3667916.html
Copyright © 2011-2022 走看看