当前位置: 首页 > 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.dtcms.com/a/347868.html

相关文章:

  • SQL注入1----(sql注入原理)
  • 深入理解 OPRF 技术:盲化伪随机函数的原理、对比与应用
  • UE 官方文档学习 C++TArray 移除操作
  • C++11: std::weak_ptr
  • 单片机的输出模式推挽和开漏如何选择呢?
  • leetcode算法刷题的第十六天
  • std::exchange详解
  • 智慧交通夜间逆光误检率↓81.4%!陌讯多模态融合算法在主干道监测的落地优化
  • 暴雨环境漏检率下降78%!陌讯动态融合算法在道路积水识别的工程突破
  • 电感反射特性
  • dinov3使用介绍
  • 【51单片机】【protues仿真】 基于51单片机储物箱系统
  • 企业智脑智能体开发全解析
  • docker的基础配置
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 元宇宙的未来展望:机遇、风险与人类社会的新形态
  • FLOPs、TFLOPs 与 TOPS:计算能力单位
  • pig框架导入总结
  • Claude Code 新手使用入门教程
  • 第2题 - 登山鞋(C++实现)
  • 计算机组成原理(12) 第二章 - 主存储器的基本组成
  • 遥感机器学习入门实战教程|Sklearn案例⑨:数据预处理(Processing)
  • 基于STM32的智能温室控制系统设计
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解
  • Service详解
  • 鸿蒙异步处理从入门到实战:Promise、async/await、并发池、超时重试全套攻略
  • 【C++】全局变量/静态变量的初始化时机
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 最小覆盖子串+滑动窗口
  • 【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离