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;
    }
}
相关推荐
Haohao+++2 小时前
Stable Diffusion原理解析
人工智能·深度学习·算法
ideaout技术团队5 小时前
leetcode学习笔记2:多数元素(摩尔投票算法)
学习·算法·leetcode
代码充电宝5 小时前
LeetCode 算法题【简单】283. 移动零
java·算法·leetcode·职场和发展
不枯石8 小时前
Matlab通过GUI实现点云的均值滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab·均值算法
不枯石8 小时前
Matlab通过GUI实现点云的双边(Bilateral)滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab
白水先森10 小时前
C语言作用域与数组详解
java·数据结构·算法
想唱rap10 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
老葱头蒸鸡11 小时前
(27)APS.NET Core8.0 堆栈原理通俗理解
算法
视睿11 小时前
【C++练习】06.输出100以内的所有素数
开发语言·c++·算法·机器人·无人机
柠檬071112 小时前
matlab cell 数据转换及记录
算法