• 4Sum 解答


    Question

    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)

    Solution

    我们可以follow 3Sum的思路完成4Sum。

    这里给出average time小于O(n3)的方法。

    我们可以把4Sum拆解为2Sum的问题。首先,构造map,key为pair sum,value为list of pairs。然后,照着2Sum的方法,得出结果。

     1 public class Solution {
     2     public List<List<Integer>> fourSum(int[] nums, int target) {
     3         Arrays.sort(nums);
     4         Map<Integer, List<List<Integer>>> map = new HashMap<Integer, List<List<Integer>>>();
     5         Set<List<Integer>> result = new HashSet<List<Integer>>();
     6         for (int i = 0; i < nums.length; i++) {
     7             for (int j = i + 1; j < nums.length; j++) {
     8                 int sum = nums[i] + nums[j];
     9                 if (map.containsKey(target - sum)) {
    10                     List<List<Integer>> pairs = map.get(target - sum);
    11                     for (List<Integer> pair : pairs) {
    12                         // m1 < m2
    13                         int m1 = pair.get(0);
    14                         int m2 = pair.get(1);
    15                         // m3 < m4
    16                         int m3 = i;
    17                         int m4 = j;
    18                         if (m1 == m3 || m1 == m4 || m2 == m3 || m2 == m4) {
    19                             continue;
    20                         } else {
    21                             if (m2 < m3) {
    22                                 result.add(Arrays.asList(nums[m1], nums[m2], nums[m3], nums[m4]));
    23                             } else if (m2 > m4) {
    24                                 result.add(Arrays.asList(nums[m1], nums[m3], nums[m4], nums[m2]));
    25                             } else {
    26                                 result.add(Arrays.asList(nums[m1], nums[m3], nums[m2], nums[m4]));
    27                             }
    28                         }
    29                     }
    30                 }
    31                 // Add current pair into map
    32                 List<Integer> list = new ArrayList<Integer>();
    33                 list.add(i);
    34                 list.add(j);
    35                 if (map.containsKey(sum)) {
    36                     map.get(sum).add(list);
    37                 } else {
    38                     List<List<Integer>> tmp2 = new ArrayList<Lis<Integer>>();
    39                     tmp2.add(list);
    40                     map.put(sum, tmp2);
    41                 }
    42                 
    43             }
    44         }
    45         return new ArrayList<List<Integer>>(result);
    46     }
    47 }
  • 相关阅读:
    Windows 系统变量大全
    linux编程
    CSS 对齐操作
    php 和 表单 简单交互
    HTML <input> placeholder 属性
    HTML <label> 标签
    Chap-4 Section 4.4 C++相关问题
    Chap-4 Section 4.3 COMMON块
    Chap-4 Section 4.2.4 指令修正方式
    Chap-4 Section 4.2.3 符号解析
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4941155.html
Copyright © 2020-2023  润新知