import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
int len = num.length; //获取数组长度
//特殊值处理,如果数组长度小于3,则返回空数组
if(len < 3){
return new ArrayList<>(0);
}
Arrays.sort(num); //对原数组排序
//创建一个哈希集,值为数组中的值,
HashMap<Integer,Integer> hashMap = new HashMap<>(len);
//遍历数组,将数组中的数存入哈希集
for(int i=0;i<len;i++){
if(hashMap.containsKey(num[i])){
hashMap.put(num[i],hashMap.get(num[i]) + 1);
}else {
hashMap.put(num[i],1);
}
}
ArrayList<ArrayList<Integer>> array = new ArrayList<>(); //创建一个二维数组
int temp = 0;
//,二层遍历数组
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
temp = 0 - (num[i] + num[j]); //三个数相加为0
if(hashMap.containsKey(temp)){ //如果数组中出现三个数相加为0,则保存为数组,并将数组添加到二维数组中
if(temp == num[i] && temp == num[j]){
if(hashMap.get(temp) >= 3){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else if(temp == num[i]){
if(hashMap.get(temp) >= 2){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else if(temp == num[j]){
if(hashMap.get(num[j]) >= 2){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else {
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}
}
}
//二维数组去重
for(int i=0;i<array.size()-1;i++){
for(int j=i+1;j<array.size();j++){
if(array.get(i).get(0) == array.get(j).get(0) && array.get(i).get(1) == array.get(j).get(1) && array.get(i).get(2) == array.get(j).get(2)){
array.remove(j);
j--;
}
}
}
return array; //返回二维数组
}
}
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
int len = num.length; //获取数组长度
//特殊值处理,如果数组长度小于3,则返回空数组
if(len < 3){
return new ArrayList<>(0);
}
Arrays.sort(num); //对原数组排序
//创建一个哈希集,值为数组中的值,
HashMap<Integer,Integer> hashMap = new HashMap<>(len);
//遍历数组,将数组中的数存入哈希集
for(int i=0;i<len;i++){
if(hashMap.containsKey(num[i])){
hashMap.put(num[i],hashMap.get(num[i]) + 1);
}else {
hashMap.put(num[i],1);
}
}
ArrayList<ArrayList<Integer>> array = new ArrayList<>(); //创建一个二维数组
int temp = 0;
//,二层遍历数组
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
temp = 0 - (num[i] + num[j]); //三个数相加为0
if(hashMap.containsKey(temp)){ //如果数组中出现三个数相加为0,则保存为数组,并将数组添加到二维数组中
if(temp == num[i] && temp == num[j]){
if(hashMap.get(temp) >= 3){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else if(temp == num[i]){
if(hashMap.get(temp) >= 2){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else if(temp == num[j]){
if(hashMap.get(num[j]) >= 2){
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}else {
ArrayList arrayList = new ArrayList(3);
int[] arr = new int[3];
arr[0] = num[i];
arr[1] = num[j];
arr[2] = temp;
Arrays.sort(arr);
for(int k=0;k<3;k++){
arrayList.add(k,arr[k]);
}
array.add(arrayList);
}
}
}
}
//二维数组去重
for(int i=0;i<array.size()-1;i++){
for(int j=i+1;j<array.size();j++){
if(array.get(i).get(0) == array.get(j).get(0) && array.get(i).get(1) == array.get(j).get(1) && array.get(i).get(2) == array.get(j).get(2)){
array.remove(j);
j--;
}
}
}
return array; //返回二维数组
}
}