三数之和问题

Leetcode 第15题.
题目,如图所示.

在这里插入图片描述
本题采用排序加双指针的解法.

  • 为什么要进行排序呢?

    本题的难点其实在于去除重复解,而排序的作用就是让我们更加容易的去除重复解,而且可以使我们走的每一步都更加接近目标值0,因为我们可以做出判断

流程:

  1. 排序
  2. 先给一个指针index,指向排序后的第0个元素,再给两个指针left和right,分别指向index的后一个元素和数组最后一个元素,三个指针所指的数加起来和0比较,如果小于,left++,大于right–,符合条件则加入集合,直至left和right相遇
  3. index向后移,重复2步骤,index如果指向的数比0大就可以停止了,因为后面的数都比0大,和是一定比0大的

下面附上代码:

 public static List<List<Integer>> threeSum2(int[] nums) {
        //排序加双链表
        List<List<Integer>> list=new ArrayList<>();
        if(nums==null||nums.length<3) return list;
        Arrays.sort(nums);
        int length=nums.length;
        int index=0;
        //对index的循环
        while(index<length-1&&nums[index]<=0){
            if(index>0&&nums[index]==nums[index-1]){  //去重
                index++;continue;
            }
            int left=index+1,right=length-1;
            //对左右双指针的循环
            while(left<right){
                int sum=nums[index]+nums[left]+nums[right];
                if(sum==0){
                    list.add(Arrays.asList(nums[index],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(sum<0)
                    left++;
                else
                    right--;
            }
            index++;
        }
        return list;
    }
Tmi
发布了13 篇原创文章 · 获赞 7 · 访问量 2193

猜你喜欢

转载自blog.csdn.net/wangliangluang/article/details/104066400