返回

刷题力扣第15题-三数之和

发布时间:2022-10-03 05:31:26 405

题目

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]


思路

这道题的重点是选取数组中的三个元素组成三元组,这是其一;三元组不可重复,这是其二。   《代码随想录》上用的方法是双指针法,也就是说先对数组进行排序,这个就需要借用java里的库函数来操作,排序之后,对数组进行从头到尾的遍历,如下图:   a8532b856898cba9d61a9a1b8c87460.jpg   如果当nums[i]>0, 肯定组不成三元组,毕竟这是经过排序的,如果下标为i的元素都大于0,后面的元素肯定都大于0;然后我们就去对nums[i]这个元素进行去重,为什么用nums[i] == nums[i-1]来判断有没有重复,而不是nums[i] == nums[i+1]呢,因为考虑到我们数组里的元素有可能重复,前者是判断下标不重复的方法。 后面我们来对left和right进行定义,这样所谓的a+b+c = 0 就可以转变成nums[i] + nums[left] + nums[right] = 0的式子。 再对 nums[left] 和 nums[right] 进行去重即可。  

class Solution {
    public List> threeSum(int[] nums) {
        List> result = new ArrayList<>();  //存放三元组的结果集
        Arrays.sort(nums);     //对数组进行排序

        for(int i = 0; i < nums.length; i++){      //对元素a进行遍历
            if(nums[i] > 0){
                return result;
            }

            if(i > 0 && nums[i] == nums[i-1]){    //a 的去重
                continue;
            }

            int left = i+1;        //元素b
            int right = nums.length-1;    //元素c
            while(right > left){
                int sum = nums[i] + nums[left] + nums[right];
                if(sum > 0){
                    right--;
                }else if(sum < 0){
                    left++;
                }else{
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));         //收获一组结果集
                    while(right > left && nums[right] == nums[right - 1]) right--;    // b的去重
                    while(right > left && nums[left] == nums[left + 1]) left++;      // c的去重

                    right--;
                    left++;
                }
            }
        }
        return result;
    }
}

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
如何让你的系统配置文件更合理 2022-10-03 05:11:11