zoukankan      html  css  js  c++  java
  • Leecode no.18 四数之和

    package com.example.demo.leecode;

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;

    /**
    * 四数之和等于目标
    * @Date 2020/12/8
    * @author Tang
    *
    * 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,
    * 使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
    * 注意:答案中不可以包含重复的四元组。
    */
    public class FourSumTarget {
    private Set<List<Integer>> resultSet = new HashSet<>();

    public List<List<Integer>> execute(int[] nums, int target){
    if(nums.length < 4){
    return new ArrayList<>();
    }
    nums = sort(nums, 0, nums.length - 1);
    //外层循环获取第一位数 a
    for(int i = 0; i < nums.length - 3; i++){
    int a = nums[i];

    //内层循环第二位数字 b
    for (int j = i + 1; j < nums.length - 1; j++) {
    int b = nums[j];

    int index1 = j + 1;
    int index2 = nums.length - 1;

    int c = nums[index1];
    int d = nums[index2];
    while(index1 < index2){
    if(a + b + c + d > target){
    index2--;
    d = nums[index2];
    }else if(a + b + c + d < target){
    index1++;
    c = nums[index1];
    }else{
    //成功相等
    setResultList(a, b, c, d);
    index2--;
    d = nums[index2];
    }

    }
    }

    }
    List<List<Integer>> resultList = new ArrayList<>();
    resultList.addAll(resultSet);

    return resultList;

    }

    private void setResultList(int a, int b, int c, int d){
    List<Integer> result = new ArrayList<>();
    result.add(a);
    result.add(b);
    result.add(c);
    result.add(d);
    resultSet.add(result);
    }

    /**
    * 快排
    */
    private int[] sort(int[] nums, int left, int right){
    if(left >= right){
    return nums;
    }
    int i = left;
    int j = right;
    int base = nums[i];

    while(i < j){
    int temp = 0;
    while(nums[j] > base){
    j--;
    }
    if(i < j){
    temp = nums[j];
    nums[j] = nums[i];
    nums[i] = temp;
    i++;
    }
    while(nums[i] < base){
    i++;
    }
    if(i < j){
    temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
    j--;
    }
    }
    nums[i] = base;

    int[] sortLeft = sort(nums, left, i - 1);
    int[] sortRight = sort(sortLeft, i +1, right);
    return sortRight;
    }

    public static void main(String[] args) {
    int[] nums = {6,4,8,7,5,9,3,1,6,6,9,1};
    int[] nums2 = {1,0,-1,0,-2,2};
    int[] nums3 = {0,0,0,0};
    List<List<Integer>> execute = new FourSumTarget().execute(nums3, 0);
    for (List<Integer> i: execute) {
    System.out.print(i);
    }
    }

    }
  • 相关阅读:
    推荐:负采样
    JNDI学习总结(一)——JNDI数据源的配置
    前端性能优化
    java中的引用类型概念
    java中的各种数据类型在内存中存储的方式
    POI导出EXCEL经典实现
    synchronized 与 Lock 的那点事
    黑马程序员_Map<K,V> 映射关系 Map.Entry
    Java ConcurrentModificationException异常问题
    表 (list)
  • 原文地址:https://www.cnblogs.com/ttaall/p/14102164.html
Copyright © 2011-2022 走看看