• 2.6

    • left 和 right 是在锚点的右边 ,创建新ist 是发现了才创建
    • 锚点需要在第二个位置(去重!)
  • 1.22

    • 固定锚点-》移动右边的左右指针向中间收敛(必须保证相同的数字跳过!!!包括第一个锚点)
    • 事先排序
  • 1.10

    • i 的去重时,应该是在第二个才开始的,也就是 i>0,然后 continue
    • 在左右指针的去重时,必须同时满足左指针小于右指针,然后再判断+1-1是否相等,最后一起收缩
      • “找到答案 存下来 循环跳过重复值 最后指针再走一步”
      • 固定一个锚点,然后找右边的左右指针满足三数之和
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.length-1;
            while(left<right){
                if(nums[i]+nums[left]+nums[right]==0){
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    res.add(list);
                    
                    while(left<right&&nums[left]==nums[left+1]) left++;
                    while(left<right&&nums[right]==nums[right-1]) right--;
                    left++;
                    right--;
 
            }else if(nums[i]+nums[left]+nums[right]>0){
                right--;
            }else{
                left++;
            }
            }
 
        }
        return res;
    }
}
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        //万能的Arrays,对数组都有效
        Arrays.sort(nums);
		//需要排除掉右边两个指针
        for(int i = 0;i<nums.length-2;i++){
            if(i>0&&nums[i]==nums[i-1]){
            //continue跳过for循环
                continue;
            }
            int left = i+1;
            int right = nums.length-1;
            while(left<right){
 
                if(nums[i]+nums[left]+nums[right]==0){
                //Arrays.asList方法调用
                list.add(Arrays.asList(nums[i],nums[left],nums[right]));
                while(left<right&&nums[left]==nums[left+1]){
                    left++;
                }
                while(left<right&&nums[right]==nums[right-1]){
                    right--;
                }
                left++;
                right--;
            }else if(nums[i]+nums[left]+nums[right]>0){
                right--;
            }else{
                left++;
            }
        }
    }
            
        return list;
    }
}