1. 程式人生 > >LeetCode---15. 三數之和(java實現)

LeetCode---15. 三數之和(java實現)

問題描述:

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        if(nums == null){
            return null;
        }
        //如果陣列長度小於3,返回一個空集合
        if(nums.length < 3){
            return new ArrayList<>();
        }
        //對陣列nums進行排序
        Arrays.sort(nums);
        HashSet<List<Integer>> set = new HashSet<>();
        //讓i從陣列下標為0開始跑
        for (int i = 0; i < nums.length; i++) {
            //j從i的後一個數開始
            int j = i + 1;
            //k從陣列最後一個數(最大的數)往前跑
            int k = nums.length - 1;
            while(j < k){
                if(nums[i] + nums[j] + nums[k] == 0){
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[j]);
                    list.add(nums[k]);
                    set.add(list);
                    //當有重複的數字出現時,j往前跑,防止結果有重複
                    while(j < k && nums[j] == nums[j + 1]){
                        j++;
                    }
                    while(j < k && nums[k] == nums[k - 1]){
                        k--;
                    }
                    j++;
                    k--;
                }else if(nums[i] + nums[j] + nums[k] < 0){
                    j++;
                }else{
                    k--;
                }
            }
        }
        return new ArrayList<>(set);
    }
}

程式碼實現: