zoukankan      html  css  js  c++  java
  • 【leetcode】4Sum(middle)

    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)

    思路:

    讨论里有说O(N2)的解法,好像是分为两个2 Sum来做。没仔细看。

    下面贴个常规O(n3)解法,注意去重。 

    vector<vector<int> > fourSum(vector<int> &num, int target) {
            vector<vector<int>> ans;
            if(num.size() < 4) return ans;
            int l1, l2, l3, l4;
            sort(num.begin(), num.end());
            for(l1 = 0; l1 < num.size() - 3; l1++)
            {
                if(l1 > 0 && num[l1] == num[l1 - 1]) continue; //注意去重复方法 含义是在另外三个数字固定的情况下 同一位置的数字不能重复
                for(l4 = num.size() - 1; l4 >= l1 + 3; l4--)
                {
                    if(l4 < num.size() - 1 && num[l4] == num[l4 + 1]) continue;
                    l2 = l1 + 1;
                    l3 = l4 - 1;
                    while(l2 < l3)
                    {
                        if(num[l1]+num[l2]+num[l3]+num[l4] == target)
                        {
                            vector<int> partans;
                            partans.push_back(num[l1]);
                            partans.push_back(num[l2]);
                            partans.push_back(num[l3]);
                            partans.push_back(num[l4]);
                            ans.push_back(partans);
                            
                            l2++;
                            while(num[l2] == num[l2 - 1])
                            {
                                l2++;
                            }
                            l3--;
                            while(num[l3] == num[l3 + 1])
                            {
                                l3--;
                            }
                        }
                        else if(num[l1]+num[l2]+num[l3]+num[l4] < target)
                        {
                            l2++;
                        }
                        else
                        {
                            l3--;
                        }
                    }
                }
            }
            return ans;
        }

    大神看起来更统一的代码:

    public class Solution {
        public List<List<Integer>> fourSum(int[] num, int target) {
            List<List<Integer>> results = new LinkedList<List<Integer>>();
            if (num == null || num.length < 4)
                return results;
            Arrays.sort(num);
    
            for (int s = 0; s < num.length - 3; s++) {
                if (s > 0 && num[s] == num[s - 1])  continue;
    
    
                for (int e = num.length - 1; e >= s + 3; e--) {
                    if (e < num.length - 1 && num[e] == num[e + 1]) continue;
    
                    int local = target - num[s] - num[e];
                    int j = s + 1;
                    int k = e - 1;
                    while (j < k) {
    
                        if (j > s + 1 && num[j] == num[j - 1]) {
                            j++;
                            continue;
                        }
                        if (k < e - 1 && num[k] == num[k + 1]) {
                            k--;
                            continue;
                        }
    
                        if ((num[j] + num[k]) > local)
                            k--;
                        else if ((num[j] + num[k]) < local)
                            j++;
                        else
                            results.add(new ArrayList<Integer>(Arrays.asList(
                                    num[s], num[j++], num[k--], num[e])));
                    }
                }
            }
            return results;
        }
    }
  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/dplearning/p/4277109.html
Copyright © 2011-2022 走看看