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

三数之和:用Java思路分析

15. 三数之和 - 力扣(LeetCode)

第一眼思路:

看到这题我会先想到最暴力的方法———>使用三个for循环,但是仔细一想纯粹的使用for循环,时间复杂度高(O(n^3)),最关键的是,这样杂乱无章的数组数据,是无法直接通过if语句筛除重复的三元组,必须要通过哈希表进行去重。

---------------------------------------------------------------------------------------------------------------------------------

加粗为主要内容

大体框架还是三重循环,然后我选择先对数组进行排序,用Arrays.sort()或则其他排序方法都行;

因为是从小到大排序,所以我们在计算nums[start]+nums[end]时要关注和nums[i]的关系,如果大于就end--,小于就start++,等于就三下标对应的值将添加到list。因为当sta越向右数据越大,反之end越小,这就说明sta和end之间可能还有三元组,只要sta小于end,还要进行重复的操作。

接着当sta>=end时break,i++,进行第二次寻找;重复操作,直到i==nums.length-1-2结束,i没必要超过倒数第三个下标,因为sta和end相等了会break。就算不考虑这个原因,我们换位思考,当i到倒数第二个下标,那么是不是会有一个指针指向它的左边,这不就和i在左边一样吗。

现在知道大体怎么循环了,但是我们还得考虑,如果一组数据中有重复数据该怎么办?

如:-1 -1 -1 0 0 0 1 1 1 这样当i=0时另外两指针在下标1、nums.length-12、nums.length-1-1会出现重复三元组,同理当i=1时也会出现重复。所以只要遇到相同的元素要跳过。

有这几点我们就可以开始写代码:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<>();// quickSort(nums);//快排Arrays.sort(nums);for(int i=0;i<=nums.length-1-2;i++){if(nums[i]>0) break; //当i下标指向的值都为正数,那么三数相加一定不为0if(i>0&&nums[i]==nums[i-1]) continue; //i>0是为了防止数组越界,后面与前面相同就跳出这次循环让i++int start=i+1;int end=nums.length-1;while(start<end){ArrayList<Integer> list1 = new ArrayList<>();int add=nums[start]+nums[end];if(add==-nums[i]){list1.add(nums[i]);list1.add(nums[start]);list1.add(nums[end]);list.add(list1);start++;//两指针向中靠拢--》数据大小变化你可想像一下end--;while(start<end&&nums[start]==nums[start-1]){//跳过相同大小数据start++;}while(end>start&&nums[end]==nums[end+1]){end--;}continue;}else if(add>-nums[i]){end--;}else{if(add<-nums[i]){start++;}}}}return list;}

http://www.dtcms.com/a/549010.html

相关文章:

  • 企业有没有必要自建一套培训考试
  • 测试开发话题06---测试分类(1)
  • 【Agentic RL专题】一、LLM agent 与 agentic RL
  • 使用Java做URL短连接还原长链接获取参数
  • 自己网站做电子签章有效么有哪些网站做汽车周边服务
  • 做网站去哪好在线表单 wordpress
  • 从信号零损耗到智能协同:高清混合矩阵全链路技术拆解,分布式可视化系统十大趋势重塑行业
  • 【超详细】MySQL事务面试题
  • Ubuntu(③vsftpd)
  • Ubuntu 25.10 发布,各种衍生版也发布
  • HUAWEI A800I A2 aarch64架构Ubuntu服务器鲲鹏920开启 IOMMU/SMMU 硬件虚拟化功能
  • GitHub 发布 Agent HQ:欢迎回家,智能体们
  • 使用 Python 将 PowerPoint 转换为 Word 文档
  • 怎么成立自己的网站公司网站建设案例
  • 做数码后期上数码网站企业推广文章
  • iOS 抓包工具实战 开发者的工具矩阵与真机排查流程
  • Spring Boot 整合第三方组件:Redis、MyBatis、Kafka 实战
  • 可视化图解算法66:两个数组的交集
  • 7 种方法:如何将视频从电脑传输到安卓手机
  • Qt GridLayout布局详解:从基础到高级技巧
  • BTreeMap 的 B-Tree 之心:性能与安全的 Rust 式演绎
  • 中国查公司的网站长沙 网站设计 公司
  • R 因子:深度解析其在统计学中的重要作用
  • Laravel 结合影刀 RPA 实现企业微信自动询单报价流程
  • Rust 入门之Rust 运算符全面解析:从基础到实战
  • Rust:借用 切片
  • 【Blender工具】
  • Spring Al学习6:嵌入模型 API
  • 坪山区住房和建设局网站wordpress能放视频
  • 网站承建商有哪些注册了一个域名怎么做网站