LeetCode[15]三数之和

思路:

一开始我想的用哈希表来做,但是怎么想怎么麻烦,最后看解析,发现人家用的双指针,那我来讲一下我这道题理解的双指针。

这道题使用双指针之前一定要给数组进行排序,ok为什么排序?因为我需要两个指针模拟移动,三个数相加,如果和大于0了,是不是后面的指针就可以退一位,小于0了,前面的指针就能加一位了。(完美,这就是排序的必要性)

首先一个节点来进行数组的遍历,这个节点也相当于三数之和的第一个值,两个指针分别代表另外两个值,left指针和right指针就肯定在第一个值后面的数组中遍历了,具体怎么遍历呢,就是一个在新数组的头遍历,一个在尾部遍历。

这样头尾指针移动就出来结果了,但是这个结果准确吗?因为题目要求我们是去重的,相当于三个数一样,排列不同也不行,那么关键就在这个去重。

去重:首先去重第一个值,也就是当前遍历的值numsi,当numsi和numsi-1一样的时候,那么当前值就是遍历过的,这种情况就去重。

随后我们就遍历剩下的两个指针,如果和三个数和大于0,尾指针-1,如果和小于0,头指针+1,最后等于0的情况下,加入我们的结果集。

这就完事了吗?不不不,我们后两个指针还没去重呢!相等添加到结果集后,我们头尾指针都要向内部移动一位吧,那么当尾指针和尾指针的前一个指针一样,那么就要给尾指针去重,头指针同理如果和头指针的后一位一样,那么头指针一样要去重,这样我们三个指针都去重过,我们的答案也就毋庸置疑了。

代码:

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0)
                return res;
            if (i > 0 && nums[i] == nums[i - 1])
                continue;

            int left = i + 1;
            int right = nums.length - 1;
            while (right > left) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum > 0) {
                    right--;
                } else if (sum < 0) {
                    left++;
                } else {
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    while (right > left && nums[right] == nums[right - 1])
                        right--;
                    while (right > left && nums[left] == nums[left + 1])
                        left++;

                    left++;
                    right--;
                }
            }
        }
        return res;
    }
}
相关推荐
JieE2121 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack209 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树10 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2121 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2121 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术1 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦1 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050731 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架