LeetCode[15]三数之和

思路:

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

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

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

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

去重:首先去重第一个值,也就是当前遍历的值nums[i],当nums[i]和nums[i-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;
    }
}
相关推荐
沐苏瑶5 小时前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
ccLianLian5 小时前
深度学习·DDPM
数据结构
ZoeJoy86 小时前
算法筑基(二):搜索算法——从线性查找到图搜索,精准定位数据
算法·哈希算法·图搜索算法
Alicx.6 小时前
dfs由易到难
算法·蓝桥杯·宽度优先
_日拱一卒6 小时前
LeetCode:找到字符串中的所有字母异位词
算法·leetcode
云泽8087 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
Wilber的技术分享7 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病7 小时前
Problem L. ZZUPC
c++·数学·算法·前缀和
梯度下降中9 小时前
LoRA原理精讲
人工智能·算法·机器学习
IronMurphy9 小时前
【算法三十一】46. 全排列
算法·leetcode·职场和发展