zoukankan      html  css  js  c++  java
  • 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的基础上稍微修改即可,O(n ^ 3)。
     1 public class Solution {
     2     public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
     3         // Note: The Solution object is instantiated only once and is reused by each test case.
     4          Arrays.sort(num);
     5         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
     6         if(num == null || num.length < 4) return result;
     7         int len = num.length;
     8         for(int i = 0; i <= num.length - 4; i ++){
     9             if(i==0 || num[i] > num[i-1]){
    10                 for(int a = num.length - 1; a > i + 2; a --){
    11                     if(a == num.length - 1 || num[a] < num[a + 1]){
    12                         int j = i + 1;
    13                         int h = a - 1;
    14                         while(j < h){
    15                             int sum = num[j] + num[h] + num[i] + num[a];
    16                             if(sum == target){
    17                                 ArrayList<Integer> row = new ArrayList<Integer>();
    18                                 row.add(num[i]);
    19                                 row.add(num[j]);
    20                                 row.add(num[h]);
    21                                 row.add(num[a]);
    22                                 result.add(row);
    23                                 h--;
    24                                 j++;
    25                                 while(h>j && num[h]==num[h+1]) h--; 
    26         
    27                                 while(j<h && num[j]==num[j-1]) j++;
    28                             }else if(sum < target){
    29                                     j ++;
    30                             }else if(sum > target){
    31                                     h --;
    32                             }
    33                         }
    34                     }
    35                 }
    36             }
    37         }
    38         return result;
    39     }
    40 }
  • 相关阅读:
    iptables 学习
    linux frp 配置
    LINUX下安装TOMCAT 及JDK方法
    更改默认源pip
    重装ORACLE参考
    pandas入门学习
    python笔记
    redis 笔记
    STM32工程编译后TIM1时钟变慢的解决
    IAR工程编译错误问题
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3373838.html
Copyright © 2011-2022 走看看