• 18. 4Sum


    https://leetcode.com/problems/4sum/#/solutions

    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: 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]
    ]
    public class Solution {
        public List<List<Integer>> fourSum(int[] num, int target) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if (num==null || num.length==0) return res;
            Arrays.sort(num);
            
            int max = num[num.length-1];
            if (4 * num[0] > target || 4 * max < target)
                return res;
            
            for (int i=num.length-1; i>=3; i--) {
                if (i<num.length-1 && num[i]==num[i+1]) continue;
                threeSum(0, i-1, num, target-num[i], res, num[i]);
            }
            return res;
        }
        
        public void threeSum(int start, int end, int[] num, int target, List<List<Integer>> res, int last1) {
            for (int i=end; i>=2; i--) {
                if (i<end && num[i]==num[i+1]) continue;
                twoSum(0, i-1, num, target-num[i], res, num[i], last1);
            }
        }
        
        public void twoSum(int l, int r, int[] num, int target, List<List<Integer>> res, int last2, int last1) {
            while (l < r) {
                if (num[l]+num[r] == target) {
                    List<Integer> set = new ArrayList<Integer>();
                    set.add(num[l]);
                    set.add(num[r]);
                    set.add(last2);
                    set.add(last1);
                    res.add(new ArrayList<Integer>(set));
                    l++;
                    r--;
                    while (l<r && num[l] == num[l-1]) {
                        l++;
                    }
                    while (l<r && num[r] == num[r+1]) {
                        r--;
                    }
                }
                else if (num[l]+num[r] < target) {
                    l++;
                }
                else {
                    r--;
                }
            }
        }
    }
    

      

  • 相关阅读:
    RAM disk
    将2个物理磁盘做成4个逻辑卷
    LVM——基本概念
    服务器CPU架构演变过程
    IBM XIV
    011——一些貌似高逼格的词汇
    010——存储系统架构演变
    010——集群化
    009——虚拟化
    008——协议融合
  • 原文地址:https://www.cnblogs.com/apanda009/p/7103037.html
Copyright © 2020-2023  润新知