欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 15.三数之和

程序员文章站 2022-07-15 11:17:00
...

原题如下

https://leetcode-cn.com/problems/3sum/
leetcode 15.三数之和

题解

方法一

此方法的先对数组进行排序,然后从左到右,先确定第一个数,也就是最小的数one。先判断one大于0的时候就可以输出答案,因为三个数和为0的时候,最小的数肯定是小于等于0的。临时确定one,我们要开始照第二、三个数字two和three,起初的two确定的是one右边第一个数字,three是最后第一个数字,三数字和,he为0时,输出组合并继续进行two和three的找寻。在进行每一轮找寻时,看看two往右或者three往左是不是重复的,是则移动到下一个。直到不是重复为止。另外he的值大于或者小于0,two或者three要进行相应移动才行,当然上述小循环中有two<three,否则就要进行大循环下一轮。说一下,每个大轮确定one时,也要不能重复哦。
本思路java实例:

/*参考lc用户 @guanpengchn 的解法
 *@v7fgg
 *执行用时 :23 ms, 在所有 Java 提交中击败了83.18%的用户
 *内存消耗 :43.9 MB, 在所有 Java 提交中击败了98.11%的用户
 *2020年6月10日 14:25
 */
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans=new ArrayList<>();
        if(nums.length>2){
            Arrays.sort(nums);
            for(int one=0;one<nums.length-2;one++){
                if(nums[one]>0){break;}//最小的数大于零,和不会为0
                if(one>0&&nums[one-1]==nums[one]){continue;}
                //以这个数字为首位的所有组合都已经考虑过了
                int two=one+1;
                int three=nums.length-1;
                while(two<three){
                    int he=nums[one]+nums[two]+nums[three];
                    if(he==0){
                        ans.add(Arrays.asList(nums[one],nums[two],nums[three]));
                        while(two<three&&nums[two]==nums[two+1]){two++;}
                        while(two<three&&nums[three]==nums[three-1]){three--;}
                        //以这俩数字为第二、三个数的组合已经考虑过了
                        //为了在进行下一次判断之前就剔除重复
                        two++;
                        three--;
                    }
                    else{
                        if(he>0){three--;}
                        else{two++;}
                    }
                }
            }
        }
        return ans;
    }
}

参考资料:https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/