
leetcode题解15-三数之和(双指针经典)
发布日期:2025-04-05 05:05:51
浏览次数:10
分类:精选文章
本文共 1749 字,大约阅读时间需要 5 分钟。
为了判断数字数组中是否存在三个元素使其和为零,并找出所有不重复的三元组,可以按照以下步骤运用排序和双指针技术:
排序数组:首先将数组按照升序排列,这样有利于后续使用双指针法减少重复组合。
初始检查:如果数组长度小于3,直接返回空数组,因为无法构成三个数之和为0的情况。
三重循环中的优化:通过固定一个起始指针i,后面的指针j从i+1开始,指针k从末尾开始移动。这种方法可以保证j的位置单调递增,k的位置单调递减,从而避免重复的组合。
重复检查:为了防止生成重复的三元组,在选择i时,如果前面的元素值与当前元素值相同,应跳过,避免重复。
双指针移动:
- 当三数之和大于0时,应将k指针左移,尝试找到更大的负数。
- 当三数之和小于0时,将j指针右移,寻找更小的数值。
- 当和等于0时,生成该组合的三元组,并添加到结果集中。
去重处理:使用集合记录已经找到的三元组,防止重复结果。
以下是实现代码:
import java.util.ArrayList;import java.util.List;public class Solution { private List
> result; public List
> threeSum(int[] nums) { result = new ArrayList<>(); if (nums.length < 3) { return result; } Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) break; // 后面的数都大于0,无法满足条件 // 跳过相同的元素以避免重复 if (i > 0 && nums[i] == nums[i - 1]) { continue; } int j = i + 1; int k = nums.length - 1; List
> currentList = new ArrayList<>(); int prej = -1; while (j < k) { if (result.contains(nums[i], nums[j], nums[k])) { j++; k--; continue; } int sum = nums[i] + nums[j] + nums[k]; if (sum == 0) { if (prej != -1 && nums[j] == nums[prej]) { k--; j++; continue; } currentList.add(ActivityUtils.newArrayList(nums[i], nums[j], nums[k])); result.add(currentList); prej = j; } else if (sum > 0) { k--; } else { j++; } } } return result; }}
步骤解释:
排序数组:使用Java的Arrays.sort(nums)
对数组进行升序排列。
快速排除不可能情况:如果当前元素大于0,后续元素较大的数无法与它构成和为0的三元组,因此退出循环。
避免重复元素:当i不为0且当前元素等于前一个元素时,跳过当前i,避免重复组合。
双指针遍历:固定i,j从i+1开始,k从末尾开始。计算三数之和,根据和的大小决定j和k的移动方向。
防止重复三元组:使用内置集合检查是否已经存在该三元组,避免重复输出。
收集结果:在发现符合条件的三元组时,添加到结果列表中。
这种方法通过排序和双指针技术,有效地将时间复杂度优化到O(n²),实现高效的三元组检测与收集。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年05月13日 03时22分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android DEX加固方案与原理
2021-05-10
iOS_Runtime3_动态添加方法
2021-05-10
我用wxPython搭建GUI量化系统之最小架构的运行
2021-05-10
selenium+python之切换窗口
2021-05-10
map[]和map.at()取值之间的区别
2021-05-11
VTK:可视化之RandomProbe
2021-05-12
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2021-05-12
pair的用法
2021-05-12
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2021-05-14
echarts 基本图表开发小结
2021-05-14
TreeSet、TreeMap
2021-05-14
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2021-05-14
嵌入式系统试题库(CSU)
2021-05-15
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2021-05-15
00013.05 字符串比较
2021-05-15
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2021-05-16
Android 架构组件 – 让天下没有难做的 App
2021-05-16
能解决数据可视化大屏需求的3款可视化工具
2021-05-16