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;
    }
}
相关推荐
那个村的李富贵6 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿6 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
Yvonne爱编码6 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
熬夜有啥好6 小时前
数据结构——哈希表
数据结构·散列表
琹箐7 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia17 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了7 小时前
数据结构之树(Java实现)
java·算法
算法备案代理7 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.8 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
我能坚持多久8 小时前
【初阶数据结构01】——顺序表专题
数据结构