zoukankan      html  css  js  c++  java
  • LeetCode

    题目:

    Given an array S of n integers, are there elements a, b, c, 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和2sum的思路,不断往下找,注意排除重复的元素。

    package sum;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class FourSum {
    
        public List<List<Integer>> fourSum(int[] nums, int target) {
            int len;
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if (nums == null || (len = nums.length) < 4) return res;
            Arrays.sort(nums);
            for (int i = 0; i < len; ++i) {
                List<Integer> subRes = new ArrayList<Integer>();
                subRes.add(nums[i]);
                getOtherThree(res, subRes, nums, i + 1, len, target);
                while (i + 1 < len && nums[i + 1] == nums[i]) ++i;
            }
            
            return res;
        }
        
        private void getOtherThree(List<List<Integer>> res, List<Integer> subRes, int[] nums, int start, int len, int target) {
            for (int i = start; i < len; ++i) {
                List<Integer> copySubRes = new ArrayList<Integer>(subRes);
                copySubRes.add(nums[i]);
                getOtherTwo(res, copySubRes, nums, i + 1, len, target);
                while (i + 1 < len && nums[i + 1] == nums[i]) ++i;
            }
        }
        
        private void getOtherTwo(List<List<Integer>> res, List<Integer> subRes, int[] nums, int start, int len, int target) {
            int sum = 0;
            for (int i : subRes) sum += i;
            int rem = target - sum;
            
            int left = start;
            int right = len - 1;
            while (left < right) {
                if (nums[left] + nums[right] == rem) {
                    List<Integer> copySubRes = new ArrayList<Integer>(subRes);
                    copySubRes.add(nums[left]);
                    copySubRes.add(nums[right]);
                    res.add(copySubRes);
                    do { ++left; } while (left < len && nums[left - 1] == nums[left]);
                    do { --right; } while (right >=0 && nums[right + 1] == nums[right]);
                } else if (nums[left] + nums[right] < rem) {
                    ++left;
                } else {
                    --right;
                }
            }
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] nums = { 0,0,4,-2,-3,-2,-2,-3 };
            FourSum f = new FourSum();
            List<List<Integer>> res = f.fourSum(nums, -1);
            for (List<Integer> l : res) {
                for (int i : l)
                    System.out.print(i + "	");
                System.out.println();
            }
        }
    
    }
  • 相关阅读:
    docker三剑客之docker compose
    docker三剑客之一docker compose
    dockerfile创建镜像(二)
    dockerfile创建镜像
    dockerfile创建镜像
    端口映射和容器映射
    鼠标点击左侧字母,字母变色
    body滚动时左侧菜单固定
    左侧菜单收缩展开
    车林通购车之家--购车计算器模块--算法js
  • 原文地址:https://www.cnblogs.com/null00/p/5060227.html
Copyright © 2011-2022 走看看