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;
    }
}
相关推荐
aini_lovee1 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
yong99901 小时前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5051 小时前
深入理解主成分分析(PCA)
算法
apollowing1 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app
晚枫歌F1 小时前
最小堆定时器
数据结构·算法
Lumos_7772 小时前
Linux -- 线程
java·jvm·算法
七颗糖很甜2 小时前
“十五五”气象发展规划:聚焦五大核心任务
大数据·python·算法
科研前沿2 小时前
镜像视界浙江科技有限公司的关键技术突破有哪些?
大数据·人工智能·科技·算法·音视频·空间计算
嫩萝卜头儿3 小时前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度
星马梦缘3 小时前
算法设计与分析 作业二 答案与解析
算法·图论·dfs·bfs·floyd-warshall·bellman_ford·多源最短路