leecode 15. 三数之和

 

/*
 * 15. 3Sum
 * 题意:找出数组中所有和为0的三元组合
 * 难度:Medium
 * 分类:Array, Two Pointers
 * 注意:如何避免 List 重复元素
 * Tips:lc15, lc16, lc923
 */
import java.util.*;

public class lc15 {
    public static void main(String[] args) {
        int[] nums = {-1, 0, 1, 2, -1, -4};
        System.out.println(threeSum(nums).toString());
    }

    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length-2 ; i++) {
            if( i>0 && nums[i]==nums[i-1] ) //防止重复添加相同内容List
                continue;
            int left = i+1, right = nums.length-1;
            while(left<right){
                if( nums[i]+nums[left]+nums[right] == 0 ){
                    result.add(Arrays.asList(nums[i],nums[left],nums[right]));   //Arrays.asList(int a, int b, intc);
                    while(left<right && nums[left]==nums[left+1])   //防止重复添加相同内容List
                        left++;
                    while(left<right && nums[right]==nums[right-1])     //防止重复添加相同内容List
                        right--;
                    left++;
                    right--;
                }else if( nums[i]+nums[left]+nums[right] < 0 )
                    left++;
                else
                    right--;
            }
        }
        return result;
    }

}

 

posted @ 2021-04-14 16:53  kpwong  阅读(50)  评论(0编辑  收藏  举报