LeetCode:三数之和

给定一个包含 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) {
        List<List<Integer>> mlists=new ArrayList<List<Integer>>();
        Arrays.sort(nums);    //排序
        for(int k=0;k<nums.length;k++){
            int i=k+1;          //左指针
            int j=nums.length-1;         //右指针
            while(i<j){     
                int target=nums[i]+nums[j]; //左右两数之和
                if(nums[k]>(0-target)){  //即遍历的数大于差值 即右边的数大了 右指针向左移动 
                    j--;
                }else {
                  if(nums[k]<(0-target)) { //即遍历的数小于差值 即左边的数大了 左指针向右移动 
                    i++;
                } else {
                        if(nums[k]==(0-target)){  //找到符合要求的三个数
                            List<Integer> list=new ArrayList<>();
                            list.add(nums[k]);
                            list.add(nums[i]);
                            list.add(nums[j]);
                            mlists.add(list); 
                         //防止集合重复 将相隔为一的相同数过滤掉
                            while(i<j&&nums[i]==nums[i+1]){ 
                    i++;
                }
                while(i<j&&nums[j]==nums[j-1]){
                    j--;
                }
               i++;
                j--;
                        }
                    }
                      }
              
            } 
              //防止集合重复 将靠着的相同数过滤掉
                            while(i<j&&nums[i]==nums[i+1]){ 
            while(k<nums.length-1&&nums[k]==nums[k+1]){
                    k++;
                }
        }
        return mlists;
    }
}

猜你喜欢

转载自blog.csdn.net/smile__dream/article/details/81413272