zoukankan      html  css  js  c++  java
  • 【LeetCode】4Sum 解题报告

    【题目】

    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)
    【解析】

    3Sum 3Sum Closest 的扩展,相同思路,加强理解。

    K Sum 问题的时间复杂度好像为 O(n^(k-1)) ?!假设有更好的,欢迎不吝赐教!

    【Java代码】

    public class Solution {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        
        public List<List<Integer>> fourSum(int[] num, int target) {
            if (num == null || num.length < 4) return ret;
            Arrays.sort(num);
            int len = num.length;
            for (int i = 0; i < len-3; i++) {
                if (i > 0 && num[i] == num[i-1]) continue;
                for (int j = i+1; j < len-2; j++) {
                    if (j > i+1 && num[j] == num[j-1]) continue;
                    findTwo(num, j+1, len-1, target, num[i], num[j]);
                }
            }
            return ret;
        }
        
        public void findTwo(int[] num, int begin, int end, int target, int a, int b) {
            if (begin < 0 || end >= num.length) return;
            int l = begin, r = end;
            while (l < r) {
                if (a+b+num[l]+num[r] < target) {
                    l++;
                } else if (a+b+num[l]+num[r] > target) {
                    r--;
                } else {
                    List<Integer> ans = new ArrayList<Integer>();
                    ans.add(a);
                    ans.add(b);
                    ans.add(num[l]);
                    ans.add(num[r]);
                    ret.add(ans);
                    l++;
                    r--;
                    while (l < r && num[l] == num[l-1]) l++;
                    while (l < r && num[r] == num[r+1]) r--;
                }
            }
        }
    }


  • 相关阅读:
    GPG实践
    keepass数据库保存密码
    基于xammp搭建自己的网页
    《信息安全专业导论》第12周学习总结
    《信息安全专业导论》第11周学习总结
    基于python中tkinter的计算机实现
    《信息安全专业导论》第10周学习总结
    俄罗斯方块
    小学四则运算编程实践
    链表
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4202732.html
Copyright © 2011-2022 走看看