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

双指针:三数之和

题目描述:求一个整形数组中,构成三数之和为0的所有互不相同的三元组。

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

解释:虽然-1有两个,即[-1,0,1]的三元组有两个,但只返回一个。


求解思路1:使用哈希方法求解两数之和的思路,细节是处理重复值,直接使用set存结果集。

class Solution {public List<List<Integer>> threeSum(int[] nums) {// 求两数之和时,用的hash表HashSet<Integer> hash = new HashSet<>();// 存放最终的结果集Set<List<Integer>> record = new HashSet<>();// 第一层循环,确定第一个数for (int i = 0; i < nums.length; i++) {int twoSum = -nums[i];// 求两数之和的过程for (int j = i + 1; j < nums.length; j++) {int oneSum = twoSum - nums[j];// 判断差的数是否存在// 我的思想误区,解释下:因为是先判断找的差值,再存当前的数,不存在[3],6=target=3+3这种情况if (hash.contains(oneSum)) { List<Integer> arr = new ArrayList<>();arr.add(nums[i]);arr.add(nums[j]);arr.add(oneSum);Collections.sort(arr);record.add(arr);}// 把当前的数放进去hash.add(nums[j]);}hash.clear();}return new ArrayList<>(record);}
}

巩固一下:可以使用Set构造List,最终得到的是唯一的值的List。转换方法:

使用new ArrayList<>(HashSet)new LinkedList<>(HashSet)即可将HashSet转换为List。例如:

HashSet<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
List<String> list = new ArrayList<>(hashSet);

求解思路2:排序(为了二分查找)+两数之和+双指针

class Solution {public List<List<Integer>> threeSum(int[] nums) {int len = nums.length;Set<List<Integer>> record = new HashSet<>();Arrays.sort(nums);for (int i = 0; i < len; i++) {int twoSum = -nums[i];int left = i + 1;int right = len - 1;while (left < right) {if (twoSum == nums[left] + nums[right]) {List<Integer> arr = new ArrayList<>();arr.add(nums[left]);arr.add(nums[right]);arr.add(nums[i]);Collections.sort(arr);record.add(arr);// 固定left或者right,寻找到的都是重复的,所以双指针同时走left++;right--;} else if (twoSum > nums[left] + nums[right]) {left++;} else if (twoSum < nums[left] + nums[right]) {right--;}}}return new ArrayList<>(record);}
}

练习地址:15. 三数之和 - 力扣(LeetCode)

http://www.xdnf.cn/news/1354555.html

相关文章:

  • Sentinel相关记录
  • OSI参考模型TCP/IP模型 二三事
  • docker的基础配置
  • redis----hash类型详解
  • Python的标准库之时间库(小白五分钟从入门到精通)
  • 终端复用工具 tmux 的使用方式与推荐配置
  • Autosar CAN开发06(CAN通讯开发需求-CAN矩阵)
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹
  • 【机器学习深度学习】模态与多模态的概念
  • 使用 AD 帐户从 ASP.NET 8 容器登录 SQL Server 的 Kerberos Sidecar
  • uniapp对接一键登录
  • FL Studio Win版.exe安装教程(直接安装版/详细步骤/附安装包下载)
  • 全面解析主流AI模型:功能对比与应用推荐
  • 离线优先与冲突解决:ABP vNext + PWA 的边缘同步
  • AI实现超级客户端打印 支持APP 网页 小程序 调用本地客户端打印
  • 可视化-模块1-HTML-02
  • week4-[循环结构]生日悖论-new
  • Dubbo vs Feign
  • Python 学习(十六) 下一代 Python 包管理工具:UV
  • More Effective C++ 条款04:非必要不提供默认构造函数
  • Day58 Java面向对象13 instanceof 和 类型转换
  • OCR、文档解析工具合集(下)
  • Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
  • 【51单片机】【protues仿真】基于51单片机冰箱系统
  • 嘉立创EDA快捷键汇总
  • 每日一题8.23
  • Windows应急响应一般思路(三)
  • 从词源和输出生成等角度详细解析PHP中常用文件操作类函数
  • BEVDet/BEVDet4D
  • 【40页PPT】数据安全动态数据脱敏解决方案(附下载方式)