三数之和用双指针解法核心是排序定序、固定首数+双指针收缩、全程去重;先排序确保升降有序,再外层遍历固定nums[i]并剪枝去重,内层用L=i+1、R=n-1双向收缩找和为-nums[i]的两数。

直接上手就能写对,关键不是背代码,而是理清指针怎么动、什么时候跳、边界在哪——三数之和用双指针,核心就三点:排序定序、固定+收缩、去重防复。
先排序,给双指针铺路
不排序,双指针就失去意义。排序后数组升序排列,才能靠“和大了缩右、和小了扩左”精准调控。Java 一行搞定:Arrays.sort(nums);。这步不能省,也不建议手动实现排序——面试官默认你用标准库。
外层遍历固定第一个数,注意剪枝和去重
用 i 从 0 遍历到 nums.length - 3(保证后面至少有两个数可选):
- 如果 nums[i] > 0,直接 break —— 后面全正数,加起来不可能为 0;
- 如果 i > 0 && nums[i] == nums[i-1],continue —— 跳过重复首元素,避免结果重复;
- 每次固定 nums[i] 后,目标就变成找 nums[L] + nums[R] == -nums[i]。
内层双指针收缩,方向别反、越界要防
设 L = i + 1,R = nums.length - 1,循环条件是 L :
立即学习“Java免费学习笔记(深入)”;
- 若 nums[L] + nums[R] < target → 和太小,L++;
- 若 nums[L] + nums[R] > target → 和太大,R--(⚠️不是 R++!写错直接越界报错);
- 若相等 → 找到一组解,加入结果,然后先跳重再移动:
while (L while (L 最后 L++; R--;
边界检查一个都不能少
所有指针操作前都要确认不越界:
- 外层 i ;
- 内层 while 循环必须用 L 控制;
- 跳重时判断 L 再比值,比如 nums[L] == nums[L+1] 前确保 L+1 合法;
- 初始判空:if (nums == null || nums.length ();


















