三數之和
給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。題目來自LeetCode的<三數之和>。
注意:答案中不可以包含重複的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[ [-1, 0, 1],[-1, -1, 2] ]
下面這段代碼可以跑通,但存在效率問題,在跑case時,超出時間限制。
代碼1
package com.hw.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public static List<List<Integer>> threeSum(int[] nums) {
List<Integer> lqZero = new ArrayList<>();
List<Integer> glZero = new ArrayList<>();
List<List<Integer>> results = new ArrayList<>();
for (int num : nums) {
if(num <= 0 ){
lqZero.add(num);
}else{
glZero.add(num);
}
}
isEqual(lqZero,glZero,results);
isEqual(glZero,lqZero,results);
return results;
}
public static List<List<Integer>> isEqual(List<Integer> optionList, List<Integer> compList, List<List<Integer>> results){
int count = 0;
for (int i = 0; i < optionList.size(); i++) {
int num1 = optionList.get(i);
for (int j = i + 1; j < optionList.size(); j++) {
int num2 = optionList.get(j);
int sum = ( num1 + num2 ) * -1;
if(compList.contains(sum)){
boolean isSame = false;
List<Integer> tmp = new ArrayList<>();
for (List<Integer> result : results) {
if(result.get(0) == sum && result.contains(num1) && result.contains(num2) ){
isSame = true;
break;
}
}
if(!isSame){
tmp.add(sum);
tmp.add(num1);
tmp.add(num2);
results.add(tmp);
}
}
}
if(num1 == 0 && ++count == 3){
List<Integer> tmp = new ArrayList<>();
tmp.add(0);
tmp.add(0);
tmp.add(0);
results.add(tmp);
}
}
return results;
}
public static void main(String[] args) {
int []nums = {-1, 0, 1, 2, -1, -4};
List<List<Integer>> results = threeSum(nums);
for (List<Integer> result : results) {
System.out.println(Arrays.toString(result.toArray()));
}
}
}
代碼2
package com.xatali.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
Arrays.sort(nums);
List<Integer> tmp = new ArrayList<Integer>();
int zeroCount = 0;
for (int i = 0; i < nums.length; i++) {
if(tmp.size() > 0 && tmp.get(0) == nums[i]){
continue;
}else if(nums[i] == 0){
if(++zeroCount == 3){
tmp.clear();
tmp.add(0);
tmp.add(0);
tmp.add(0);
List<Integer> result = new ArrayList<Integer>(tmp);
results.add(result);
break;
}
}
for (int j = nums.length - 1; j > i; j--) {
if(nums[j] < 0 ){
break;
}else if(tmp.size() > 0 && tmp.get(0) == nums[i] && tmp.get(1) == nums[j]){
continue;
}
int num1 = nums[i];
int num2 = nums[j];
int sum = -(num1 + num2);
int minIndex = i + 1;
for (int x = minIndex; x < j; x++) {
if(sum == nums[x]){
tmp.clear();
tmp.add(num1);
tmp.add(num2);
tmp.add(sum);
List<Integer> result = new ArrayList<Integer>(tmp);
results.add(result);
break;
}
}
}
}
return results;
}
public static void main(String[] args) {
int[] nums = {-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6};
List<List<Integer>> results = threeSum(nums);
for (List<Integer> result : results) {
System.out.println(Arrays.toString(result.toArray()));
}
}
}