算法------三數之和

三數之和

給定一個包含 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()));
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章