ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三数之和问题

2020-01-22 09:04:38  阅读:238  来源: 互联网

标签:index right nums 三数 指针 问题 排序 left


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 · 访问量 2194 私信 关注

标签:index,right,nums,三数,指针,问题,排序,left
来源: https://blog.csdn.net/wangliangluang/article/details/104066400

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有