1. 程式人生 > >[leetcode] 15.三數之和

[leetcode] 15.三數之和

 三數之和

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

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

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

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

具體思路:控制一個作為遍歷的輸,去計算另外兩個數。從最左邊的數開始遍歷,比較i+1到nums.length-1的數。遇到重複的數則通過比較過濾掉。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> result = new LinkedList<>();
        if(nums!=null && nums.length>2){
            for(int i=0;i<nums.length-2;){
                int j = i+1;
                int k = nums.length - 1;
                while(j<k){
                    if(nums[j] + nums[k] == -nums[i]){
                        List<Integer> list = new LinkedList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        result.add(list);
                        
                        j++;
                        k--;
                        
                        while(j<k&&nums[j]==nums[j-1]){
                            j++;
                        }
                        while(j<k&&nums[k]==nums[k+1]){
                            k--;
                        }
                    }else if(nums[j] + nums[k] > -nums[i]){
                        k--;
                        while(j<k&&nums[k]==nums[k+1]){
                            k--;
                        }
                    }else{
                        j++;
                        while(j<k&&nums[j]==nums[j-1]){
                            j++;
                        }
                    }
                }
                i++;
                while(i<nums.length-2&&nums[i]==nums[i-1]){
                            i++;
                }
            }
        }
        return result;
    }
}