Leetcode初学——三数之和

题目:

Leetcode初学——三数之和_第1张图片

个人解析:

这道三数之和让我联想到了两数之和,如果是两数之和的话,我们会怎么做呢?

如果是我的话,要么是哈希表,要不就是双指针遍历

而这道题三数之和也不外乎如此,可以用三指针的方法进行求解

Leetcode初学——三数之和_第2张图片

我们先要对数组进行排序,这样会方便我们之后的操作

Leetcode初学——三数之和_第3张图片

我们选定i,L,R作为三个指针

Leetcode初学——三数之和_第4张图片

令s=sum(nums[i]+nums[L]+nums[R])

此时的s<0,所以我们可以让L往右移一位,直到找到s=0的时候,遍历一遍之后,令i+1

Leetcode初学——三数之和_第5张图片

此时的s恰好等于0

那我们就将这组数存到结果里,但是s=0,我们要怎么进行遍历呢?是增加L?还是减小R呢?或是L++且R--呢?

其实都可以

如果增加L

Leetcode初学——三数之和_第6张图片

此时s=1>0,所以R需要左移一位

Leetcode初学——三数之和_第7张图片

其他两种情况也是同样的

大致的原理就是如上图所示了

但是其中还有一个难点——去重

我将其放在代码中,读者可自行领略

class Solution {
    public List> threeSum(int[] nums) {
        List> res=new ArrayList>();
        Arrays.sort(nums);
        int n=nums.length;
        int i=0,j=i+1,k=n-1;
        for(i=0;i0) break;
            j=i+1;
            k=n-1;
            while(j0){
                    k--;
                    continue;
                }
            }
        }
        List> listNew = new ArrayList>(new LinkedHashSet>(res));
        //这里先将List转换成set再转换成list输出,也是去重操作
        return listNew;
    }
}

 

你可能感兴趣的:(Leetcode学习)