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

数据结构与算法--007三数之和(medium)

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

算法思路:

去重的两种方法:

方法一(暴力解法):

Arrays.asList()是 Java 中的一个方法,它用于将数组或集合转换为一个固定大小的列表(List)。

功能:

  • Arrays.asList(nums[i], nums[left], nums[right])会将传入的三个元素nums[i],nums[left],nums[right]组合成一个列表,并返回该列表。

  • 返回的这个列表是固定大小的,也就是说,你不能在这个列表中添加或删除元素,但可以修改元素的值。

package _007; import javax.imageio.stream.ImageInputStream; import java.util.*; public class _007_force { public static void main(String[] args) { int[] arr = {-1,0,1,2,-1,-4}; Solution s1 = new Solution(); List< List<Integer>> list = s1.threeSum(arr); System.out.println(list); } } class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List< List<Integer>> list = new ArrayList<>(); Set<List<Integer>> set = new HashSet<>(); int i,left,right; for ( i = 0; i < nums.length; i++) { int twoSum = nums[i]; for (left = i+1;left<nums.length; left++) { for (right = left+1; right < nums.length; right++) { if(nums[i]+ nums[left] + nums[right] == 0){ set.add(Arrays.asList(nums[i] , nums[left],nums[right])); } } } } list.addAll(set); return list; } }

方法二:()

  • 排序:首先对数组进行排序,这是使用双指针法的前提。

  • 固定一个数a:遍历数组中的每一个数作为第一个数,接着在剩余的部分使用双指针法查找其他两个数的和。

  • 双指针法:对于每个固定的数a,通过设置leftright指针,快速找到两个数的和等于-a

  • 去重

    • 找到一个结果后,leftright指针要跳过重复元素。

    • 使用双指针法时,i也需要跳过重复元素,避免重复三元组。

  • 不漏:在找到一个三元组后,leftright指针继续移动,避免停下,继续搜索可能的结果。

package _007; import java.util.*; import java.util.List; public class _007_first { public static void main(String[] args) { int[] arr = {-1,0,1,2,-1,-4}; Solution s1 = new Solution(); List<List<Integer>> list = s1.threeSum(arr); System.out.println(list); } } class Solotion2 { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); int n = nums.length; if (nums == null || n < 3) { return result; } Arrays.sort(nums); for (int i = 0; i < n; i++) { if (nums[i] > 0) { break; } if (i > 0 && nums[i] == nums[i - 1]) { continue; } int left = i + 1; int right = n - 1; while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (sum == 0) { result.add(Arrays.asList(nums[i], 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--; } } } return result; } }
http://www.cnnetsun.cn/news/95836.html

相关文章:

  • C++ 模板初阶:泛型编程的入门指南
  • 基于Java实现优雅关闭的规范化方案设计与实现
  • 时序数据战场巅峰对决:金仓数据库 VS InfluxDB深度解析
  • Windows任务管理器中CPU相关指标怎么看?
  • 【必藏】大模型入行晚了?现在就是黄金时机!小白到入门的完整路线
  • 系统思考与认知习惯
  • 速藏!2026年免费免版权音乐素材网站推荐!正规版权保障,商用无压力不侵权
  • 【数据分享】1951-2024年我国省市县三级逐日、逐月和逐年近地面气温数据(Shp/Excel格式)
  • 金融行业广告投放:在合规的赛道上,实现精准增长
  • 长安汽车11月销量28.3万辆,同比增长2.3%
  • 1688 商品详情接口深度解析:从百川签名突破到供应链数据重构
  • LobeChat心理情绪日记分析工具
  • 一文搞懂纸老虎-布隆过滤器
  • LobeChat周年庆感恩回馈活动
  • 运维系列数据库系列【仅供参考】:DM JOB作业的邮件发送
  • 当AI面临伦理投诉时,AI应用架构师该怎么办?这5个解决步骤
  • 主存编址是什么
  • Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南
  • HLS技术的局限性说明
  • 水文监测站:水资源管理的“千里眼”与“顺风耳”
  • 白银波动幅度大于黄金的原因:市场规模与属性差异深度解析
  • 【2026版】Spring Boot面试题
  • 办公小程序开发----提高工作效率
  • Jmeter 命令行压测生成HTML测试报告
  • AI编程系列——mcp与skill
  • 技术文章大纲:当云原生遇见VMware
  • AI Agent开发全攻略:2025年核心技术栈与学习资源,从新手到专家的蜕变之路!
  • LobeChat实体抽取能力在CRM中的应用
  • Java毕设项目:基于springboot天气预报查询系统(源码+文档,讲解、调试运行,定制等)
  • Netcode for GameObjects Boss Room 多人RPG战斗(6)