leecode-15 三数之和

在这里插入图片描述

我的解法(不是完全解309/314)

  • 我的思路是定义一个left和一个right,然后在向集合里去查询,看看有没有除了nums[left],和nums[right]的第三个元素,把这个问题转换为一个遍历查找问题

    • 利用List.contains()方法来查找剩余元素
    • 利用List.remove和List.add(),来模拟派出了nums[left]和nums[right]的集合
  • 但是这种思路有个问题,就是时间复杂度太高了,我只通过了309/314的示例。

    • 其中这个ArrayList.contains 是 O(n),ArrayList.remove(Integer) 也是 O(n),然后外层有一个从left-length,有一个从length-left,循环接近O(n3),时间复杂度太高了
    • int left = 0,right =0;
      ArrayList<Integer> list = new ArrayList<>();
      for(int num:nums){list.add(num);
      }
      List<List<Integer>> result = new ArrayList<>();
      for(;left<nums.length-2;left++){list.remove(Integer.valueOf(nums[left]));List<Integer> temp = new ArrayList<>();int a =0;for(right=nums.length-1;right>left;right--){list.remove(Integer.valueOf(nums[right]));a = 0-nums[left]-nums[right];if(list.contains(a)){Collections.addAll(temp,nums[left],nums[right],a);List<Integer> temp2 = new ArrayList<>(temp);Collections.sort(temp2);if(!result.contains(temp2)){result.add(temp2);}temp.clear();}list.add(nums[right]);}
      }
      return result;
      
  • 改进1:对于这个代码我们需要想办法减少它的时间复杂度,为了遍历出所有情况,内外两层循环遍历是不能够改变的。所以我们可以想办法去减少这个查找的时间复杂度,将这个集合转换为哈希集合,这样查询的时间复杂度就变成了O(1)了

    • 但是很遗憾,这个时间复杂度还是高了,还需要继续降时间复杂度
    • List<List<Integer>> result = new ArrayList<>();
      // 用 HashMap 统计每个数字的出现次数(替代 ArrayList)
      Map<Integer, Integer> count = new HashMap<>();
      for (int num : nums) {count.put(num, count.getOrDefault(num, 0) + 1);
      }
      // 为了去重,排序后按顺序枚举
      int n = nums.length;
      for (int i = 0; i < n - 2; i++) {int left = nums[i];count.put(left, count.get(left) - 1); // 用掉一个 leftfor (int j = n-1; j >i; j--) {int right = nums[j];count.put(right, count.get(right) - 1); // 用掉一个 rightint target = 0 - left - right;// 检查剩余集合中是否有 targetif (count.getOrDefault(target, 0) > 0) {List<Integer> list = Arrays.asList(left, right, target);Collections.sort(list); // 排序以确保结果的唯一性if (!result.contains(list)) {result.add(list);}}// 把 right 加回来,供下一轮使用count.put(right, count.get(right) + 1);}
      }
      return result;
      

灵神的思路

  • 灵神在讲这个题的时候先参考了这个 📄((20250730131645-jdjxatg ‘0167 两数之和II-输入有序数组’)) 这个题
    如果是两个数的话,我们就可以使用两个指针进行快速的寻找
    所以我们想想办法,看怎么使这个三个数的和变成两个数

  • 我们可以通过先对这个数组进行排序,这样就和0167题具有了相同的初始条件,即数组有序
    之后我们对这个数组进行遍历,先确定一个数,之后再剩余的数组中,找到两个数的和为0-这个数,此时就和0167题相似了。

  • 有一个点,不太容易理解,就是为什么left是从i+1开始,而不是从别的地方开始
    是因为,每次遍历的时候,都会把这个位置的所有情况给考虑到,后续的其它集合就不会包含这个元素

    //讲数组进行排序
    Arrays.sort(nums);
    int n = nums.length;
    List<List<Integer>> ans = new ArrayList<>();
    for( int i= 0; i<n-2;i++){if(i>0&&nums[i]==nums[i-1]){continue;//代表这个重复了}int left = i+1;int right= n-1;int target = 0 - nums[i];while(left<right){if(nums[left]+nums[right]>target){right--;}else if(nums[left]+nums[right]<target){left++;}else {ans.add(Arrays.asList(nums[i], nums[left], nums[right]));//之后的话进行下一轮,因为可能还有重复,我们将left和right修改//比如[-2,-2,-2,-2,4,4,4,4,4],这个地方就有可能重复left++;while(left<right&&nums[left]==nums[left-1]){left++;}right--;while(left<right&&nums[right]==nums[right+1]) {right--;}}}
    }
    return ans;
    
  • 如何剪枝
    当我们确定了第一个数,发现它和这个排序后的数组中最大的两个数相加都小于0的话,那么这个都不用看了,不可能会有等于0的情况,我们此时切换到下一个数
    当我们确定了第一个数,如果它和它紧挨着的两个数(靠近它最小的数)相加大于0,那么后续都会大于0,直接跳过

  • if(nums[i]+nums[i+1]+nums[i+2]>0){break;
    }
    if(nums[i]+nums[n-1]+nums[n-2]<0){continue;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91564.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)

在机器学习领域&#xff0c;分类任务占据核心地位。Scikit-learn作为Python的机器学习利器&#xff0c;提供了丰富高效的分类算法。现在进行初步探讨三种经典算法&#xff1a;K最近邻&#xff08;KNN&#xff09;、朴素贝叶斯&#xff08;Naive Bayes&#xff09;和决策树&…

Galaxea机器人由星海图人工智能科技有限公司研发的高性能仿人形机器人

Galaxea机器人是由星海图人工智能科技有限公司研发的高性能仿人形机器人&#xff0c;具有多种型号&#xff0c;包括Galaxea R1和Galaxea R1 Pro。以下是关于Galaxea机器人的详细介绍&#xff1a; GitHub官网 产品特点 高自由度设计&#xff1a;Galaxea R1是一款全尺寸仿人型机…

python基础:用户输入和 while 循环

一、input() 函数的工作原理input() 函数让程序暂停运行&#xff0c;等待用户输入一些文本。获取用户输入后&#xff0c;Python 将其赋给一个变量&#xff0c;以便使用。message input("Tell me something, and I will repeat it back to you: ") print(message) 结…

开启云服务器mysql本地连接(is not allowed to connect to this mysql server)

is not allowed to connect tothis mmysql server 阿里云上安装的mysql&#xff0c;发现用本地电脑的navicat链接不上。通过了解知道了原因&#xff0c;小二在此写了一篇&#xff0c;省的以后自己在碰到。 错误如图。 aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTU4MTU1My8…

电脑的时间同步电池坏掉了,每次开机都要调整时间

电脑的时间同步的电池没电了&#xff0c;每天开机时间都不对&#xff0c;要打开时间同步按钮来设置时间解决方案1.找到这个设置并打开&#xff0c;实际上&#xff0c;要打开这个界面&#xff0c;时间才会同步&#xff0c;可能是我的电脑原因&#xff0c;所以我没办法打开这个就…

mycat在游戏中的使用场景(邮件表,mysql集群,而不是邮件服)

其实还有一种是SharingJDBC&#xff0c;而且之间在B站的同学也是说用这个&#xff0c;但是我们目前项目邮件中用的却是: mycat&#xff0c;为什么呢&#xff1f;mycat其实是中间件&#xff0c;是需要独立部署的&#xff0c;是数据库服务器这块的代理&#xff0c;在应用层的话很…

TP-Link Archer C50路由器曝安全漏洞,硬编码DES密钥可解密敏感配置

漏洞概述CERT协调中心&#xff08;CERT/CC&#xff09;发布安全公告&#xff0c;披露TP-Link Archer C50路由器存在编号为CVE-2025-6982的漏洞。该漏洞源于路由器固件中使用了硬编码的DES&#xff08;数据加密标准&#xff09;解密密钥&#xff0c;这一设计缺陷使大量家庭和小型…

番茄项目3:完成了项目的数据库设计

今天抽了会时间设计了下表结构&#xff0c;并选定的使用的数据库&#xff0c;经过调查&#xff0c;我决定还是把数据存在数据库中&#xff0c;因为写SQL是我擅长的。 最终我选择使用python自带的sqlite来实现这个工具&#xff0c;具体建表语句如下&#xff1a; 基于AI生成&…

11、read_object_model_3d 读取点云

个人理解 read_object_model_3d 这个Halcon算子中的xyz_map_width这个参数设置的目的就是,把读取的点云数据中每一个点的XYZ坐标,生成一个对应的二维图像,其中图像中的坐标值就对应每一个点的索引坐标,而图像中的灰度值就对应xyz坐标??(因为得到的是三通道图像)!!并且根…

【人工智能-17】机器学习:KNN算法、模型选择和调优、朴素贝叶斯分类

上一期【人工智能-16】机器学习&#xff1a;概念、工具介绍、数据集、特征工程 文章目录一 、KNN算法1. 应用理由2. 原理核心&#xff1a;距离度量 多数投票/平均3. 优点和缺点二、模型选择和调优1.使用理由2.原理核心&#xff1a;数据划分与性能平均3.超参数搜索4. 应用场景总…

关于继承的一些知识(C++)

当我们想要设计几个类分别记录老师&#xff0c;学生的个人信息时会发现&#xff0c;像姓名、地址、身份证号、电话等等记录基础信息的成员变量是都具有的&#xff0c;重复定义会显得冗余&#xff0c;但同时它们两者又具有不同的记录信息的成员变量&#xff0c;像学生需要记录学…

永磁同步电机无速度算法--脉振方波注入法

一、原理介绍为了实现表贴式永磁电机的低速运行&#xff0c;研究一种基于高频方波测试信号注入的无位置零低速传感器控制策略。选取注入到观测直轴的脉振高频方波信号&#xff0c; 该信号注入方案可以有效避免旋转信号注入法在转子交轴分量引起转矩脉动&#xff0c; 提高系统的…

VSCode Python 与 C++ 联合调试配置指南

VSCode Python 与 C 联合调试配置指南 为了实现 Python 与 C 的联合调试&#xff0c;需要正确配置 launch.json 文件&#xff0c;具体配置如下&#xff1a; {// IntelliSense 支持查看属性描述// 更多信息请参考: https://go.microsoft.com/fwlink/?linkid830387"version…

stm32和freeRtos的can总线

STM32内置bxCAN外设&#xff08;CAN控制器、拓展CAN&#xff09;&#xff0c;支持CAN2.0A和2.0B(全部的CAN)&#xff0c;可以自动发送CAN报文和按照过滤器自动接收指定CAN报文&#xff0c;程序只需处理报文数据而无需关注总线的电平细节波特率最高可达1兆位/秒&#xff0c;高速…

充电桩与照明“联动”创新:智慧灯杆破解新能源基建难题

伴随新能源汽车保有量呈现出极为迅猛的爆发式增长态势&#xff0c;充电基础设施的建设已然逐步成为城市发展进程中不可或缺的刚性需求。国家政策鼓励推进充电设施同城市基础设施展开一体化的建设工作&#xff0c;同时大力鼓励“诸如路灯、监控杆这类市政设施去整合充电相关功能…

datagrip连接mysql数据库过程以及遇到的问题

如果遇到这种错误说明时区错误&#xff0c;解决方法 jdbc:mysql://localhost:3306?serverTimezoneGMTdatagrip连接mysql数据库下一步

Vue 3.5 defineModel:让组件开发效率提升 10 倍

简介 defineModel 是 Vue 3.4 引入并在 Vue 3.5 中稳定的一个组合式 API&#xff0c;它简化了组件的双向数据绑定实现。在此之前&#xff0c;实现双向绑定需要手动定义 props 和 emits&#xff0c;而 defineModel 将这个过程自动化&#xff0c;让代码更加简洁和直观。 主要特…

性能测试-性能测试中的经典面试题一

一、核心概念与流程类性能测试的核心类型与区别负载测试&#xff1a;逐步加压&#xff0c;探测系统阈值&#xff08;如最大TPS/响应时间&#xff09;。压力测试&#xff1a;超越阈值施压&#xff0c;验证系统崩溃点及恢复能力。稳定性测试&#xff1a;80%~90%峰值压力持续运行&…

华为昇腾芯片:多模态模型国产化的硬核突破

前言 在当今数字化时代&#xff0c;人工智能技术的发展日新月异&#xff0c;多模态模型作为 AI 领域的重要发展方向&#xff0c;正逐渐改变着人们与计算机交互的方式以及众多行业的运作模式。多模态模型能够处理多种类型的数据&#xff0c;比如图像、文本、语音等&#xff0c;从…

阿里智能AI框架Playground,即学即用

Spring AI Alibaba Playground 是 Spring AI Alibaba 社区以 Spring AI Alibaba 和 Spring AI 为框架搭建的 AI 应用。包含完善的前端 UI 后端实现&#xff0c;具备对话&#xff0c;图片生成&#xff0c;工具调用&#xff0c;RAG&#xff0c;MCP 等众多 AI 相关功能。在 playg…