当前位置: 首页 > news >正文

2025年- H7-Lc114-15.三数之和(双指针)--java版

1.题目描述

在这里插入图片描述

2.思路

思路1:
在这里插入图片描述
补充:
break 和 continue 是 Java(以及其他编程语言)中控制循环流程的重要关键字
在这里插入图片描述
在这里插入图片描述

思路2:
先判断三数之和 sum 是正的、负的还是等于 0;

只有当 sum == 0 时才加入结果;

然后再分别跳过重复的 left 和 right。

3.代码实现

方法一:不推荐,超出时间限制。
时间复杂度是 O(n²),空间复杂度最坏是 O(n²),虽然逻辑清晰,但是性能比不上双指针法,特别是在数据量大的时候容易 超时或内存爆炸。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {

        int left=0;
        int right=nums.length-1;
        
        Set<List<Integer>> result=new HashSet<>();//结果集合,保存的是三元组(一个列表),不是整数
        Arrays.sort(nums);//对数组进行按升序排序
        for(int i=0;i<nums.length-2;i++)//i<nums.length-2倒数第三个元素
        { 
             Set<Integer> seen=new HashSet<>();
                int  target=-nums[i];             // 在剩下的部分找两个数,使它们的和等于 -nums[i]

            for(int j=i+1;j<=nums.length-1;j++ )
            {
              int twochar=target-nums[j];

             if(seen.contains(twochar))
             {
              result.add(Arrays.asList(nums[i],nums[j],twochar));
             }
             seen.add(nums[j]); // 加入到哈希表,供后续查找

            }
        }
        return new ArrayList<>(result);
    

   
    }
}

方法二:双指针,时间复杂度
排序一次 O(n log n)
双指针部分是 O(n²),但跳过重复元素大幅减少不必要的操作

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);  // 排序先

        for (int i = 0; i < nums.length - 2; i++) {
            // 跳过重复的 nums[i]
            if (i > 0 && nums[i] == nums[i - 1]) continue;

            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];

                if (sum == 0) {
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));

                    // 跳过重复的 left
                    while (left < right && nums[left] == nums[left + 1]) left++;
                    // 跳过重复的 right
                    while (left < right && nums[right] == nums[right - 1]) right--;

                    left++;
                    right--;
                } else if (sum < 0) {
                    left++;  // 增加和
                } else {
                    right--; // 减小和
                }
            }
        }

        return res;
    }
}

方法三:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result=new ArrayList<>();
        Arrays.sort(nums);//数组按升序排序
        Set<List<Integer>> set = new HashSet<>();
        for(int i=0;i<nums.length-2;i++)//取倒数第三个数
        {
            //跳过重复的nums[i]
            if(i>0&&nums[i]==nums[i-1])
            continue;
            int left=i+1;//相对顺序 nums[i]、nums[left]、nums[right]
            int right=nums.length-1;
            while(left<right)
            {  
              int sum=nums[i]+nums[left]+nums[right];
              if(sum==0)
              {
                //result.add(Arrays.asList(nums[i],nums[right],nums[left]));
              List<Integer> triplet=Arrays.asList(nums[i],nums[right],nums[left]);
              set.add(triplet);
                // 跳过重复的 left
                // while(left<right&&nums[left]==nums[left+1])
                // {left++;}
                // // 跳过重复的 right
                // while(left<right&&nums[right]==nums[right-1])
                // {right--;}

                left++;
                right--;
            }
            else if(sum<0)
            {
                left++;
            }
            else
            {
                right--;// 和太大,right左移
            }
            }
        }
        

       // return result;
        return new ArrayList<>(set);
    
    }
}

相关文章:

  • oracle update 原理
  • C++的inline函数
  • 如何用MDM批量配置和管理TV Box(机顶盒)?
  • E8流程多行明细行字符串用I分隔,赋值到主表
  • 记一次api接口出现重复请求的处理过程
  • 使用人工智能大模型腾讯元宝,如何免费快速做高质量的新闻稿?
  • 【 vue + js 】引入图片、base64 编译显示图片
  • 项目日志配置模板示例
  • python的多线程和多进程程序编程
  • 语音识别——根据声波能量、VAD 和 频谱分析实时输出文字
  • 企业数据孤岛如何破
  • Harmony实战之简易计算器
  • AI中的RAG技术:检索增强生成的全面解析
  • Python自动化爬虫:Scrapy+APScheduler定时任务
  • Cesium实现鹰眼图和主地图联动
  • 管道魔法木马利用Windows零日漏洞部署勒索软件
  • 【15】Strongswan watcher详解2
  • 力扣 905 按奇偶排序数组:双指针法的优雅实现
  • 服务器(一种管理计算资源的计算机)
  • 下列软件包有未满足的依赖关系: python3-catkin-pkg : 冲突: catkin 但是 0.8.10-
  • 小米商城的网站建站/网络营销平台推广方案
  • 建网站和建网页的区别/软文广告经典案例800字
  • 北京网站开发公司前十名/网站制作哪家公司好
  • 网站seo新手/微信crm系统
  • 小说网站的会员充值是怎么做的/大数据精准营销
  • 网站开发和推广的不同/军事新闻 今日关注