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);
}
}

}
原文地址:https://www.cnblogs.com/ttaall/p/14102164.html