Leetcode 15. 3Sum (Array)

Leetcode 15. 3Sum (Medium) (java)

Tag: Array, Two Pointers

Difficulty: Medium

Discription: Given an array nums of n integers, are there elements abc in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

  

  零碎知识:

  今天看了15题的解法,了解了List的声明方式:

List<List<Integer>> res = new ArrayList<>();

  搜索了JAVA中 length, length(), size()的区别:

  1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.

  2 java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.

  3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看.

  

  算法方面:

  在一个Array题目中,求三个数的和是否为0,我自己的做法的失误之处在于选择出的答案可能有重复项,比如[1,0,-1]和[0,1,-1]其实是一样的,但是题目要求只能输出一个。参考的答案中,先将数组进行排序,这样后续操作可以避免出现重复的答案。

在Array题目中通常会用到排序,先将一个乱序的数组进行排序(Array类是Java提供的专门用来操作数组的工具类,可以提供“按照升序排序”、“相等比较”、“查找”等操作)。

Arrays.sort(nums);

  另外排完序还有一个好处就是可以cut掉很多不必要计算的情况:

for (int i = 0; i < _size - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1] || nums[i] + nums[_size - 1] + nums[_size - 2] < 0) {     //    "||"运算符之前的可以避免重复,"||"运算符之后的可以cut掉那些加上数组最后两个(最大的两个)都小于0的情况,continue,进行i++操作
                continue;
            }
            if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {                                                //     如果以i开始加上i后面的两个都大于0了,就可以不用继续了,直接break
                break;
            }
            int j = i + 1, k = _size - 1;
            while (j < k) {
                int _sum = nums[i] + nums[j] + nums[k];
                if (_sum == 0) {
                    res.add(Arrays.asList(nums[i], nums[j++], nums[k--]));
                    while (j < k && nums[k] == nums[k + 1]) {
                        k--;                                                 //     这两步也是避免重复运算
                    }
                    while (j < k && nums[j] == nums[j - 1]) {
                        j++;
                    }
                } else if (_sum > 0) {
                    k--;
                }                                                       //     这两步是为了cut不必要计算的情况                                                                              
                else {
                    j++;
                }
            }
        }

  

  Arrays.asList()函数:

  List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现:

  

  上面这两种形式都是十分常见的:将需要转化的数组作为参数,或者直接把数组元素作为参数,都可以实现转换。这样就不用像我一开始那样先放到一个List里面再放到第二个List里面了:

  

猜你喜欢

转载自www.cnblogs.com/LiMC-Littlewade/p/9620123.html