《LeetCode热题100》---<双指针篇四道②>

news2024/12/23 4:28:25

本篇博客讲解LeetCode热题100道双指针篇中的

第三道:三数之和(中等)

第四道:接雨水(困难)

第三道:三数之和(中等)

法一:暴力枚举(三重循环)

三重循环,分别枚举三个数,找出符合条件的数并用集合返回。

法二:排序+双指针 

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ret = new ArrayList<>();
        //1.排序
        Arrays.sort(nums);
        int n = nums.length;
        //2.利用双指针解决问题
        for (int i = 0; i < n - 2; ) {
            if (nums[i] > 0) {
                break;
            }
            int l = i + 1, r = n - 1;
            int target = -nums[i];

            while (l < r) {
                int sum = nums[l] + nums[r];
                if (sum < target) {
                    l++;
                } else if (sum > target) {
                    r--;
                } else {
                    ret.add(new ArrayList<Integer>(Arrays.asList(nums[l], nums[r], nums[i])));
                    l++;
                    r--;
                    while (l < r && nums[l - 1] == nums[l]) {
                        l++;
                    }
                    while (l < r && nums[r + 1] == nums[r]) {
                        r--;
                    }
                }
            }
            i++;
            while (i< n- 2 && nums[i] == nums[i - 1]) {
                i++;
            }
        }
        return ret;
    }
}

上次我们使用哈希表求解了两数之和。

这次我们使用排序+双指针求解三数之和。

首先题目描述:找到其中三个数,它们的和为。如果有多组一起返回。不能重复,返回相同的数字,因此还要去重。如果没有返回空。

1.我们利用排序来去掉重复解。

2.利用双指针寻找所有解。

①我们确定好第一个元素为num[i],寻找剩下两个数字=0-num[i]。也就是-num[i]。这样我们相当于把求解三数之和的问题转化为求解两数之和。

②利用双指针求解剩下两数之和。

如果两数之和大于目标值,则让right--

如果两数之和小于目标值,则让left++

如果等于,那么将这三个数添加到list集合当中。

重点:去重

在left <  right的情况下,如果num[left] =num [left+1] 则不断让left++。直到不相等

right去重的同理。


第四道:接雨水(困难)

 法一:动态规划

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if (n == 0) {
            return 0;
        }

        int[] leftMax = new int[n];
        leftMax[0] = height[0];
        for (int i = 1; i < n; ++i) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }

        int[] rightMax = new int[n];
        rightMax[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; --i) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }

        int ans = 0;
        for (int i = 0; i < n; ++i) {
            ans += Math.min(leftMax[i], rightMax[i]) - height[i];
        }
        return ans;
    }
}

1.正向遍历数组 height 得到数组 leftMax 的每个元素值,

2.反向遍历数组 height 得到数组 rightMax 的每个元素值

3.在得到数组 leftMax 和 rightMax 的每个元素值之后,对于 0≤i<n,下标 i 处能接的雨水量等于 min(leftMax[i],rightMax[i])−height[i]。遍历每个下标位置即可得到能接的雨水总量。 

法二:单调栈

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        Deque<Integer> stack = new LinkedList<Integer>();
        int n = height.length;
        for (int i = 0; i < n; ++i) {
            while (!stack.isEmpty() && height[i] > height[stack.peek()]) {
                int top = stack.pop();
                if (stack.isEmpty()) {
                    break;
                }
                int left = stack.peek();
                int currWidth = i - left - 1;
                int currHeight = Math.min(height[left], height[i]) - height[top];
                ans += currWidth * currHeight;
            }
            stack.push(i);
        }
        return ans;
    }
}

1.从左到右遍历数组,遍历到下标 i 时,如果栈内至少有两个元素,记栈顶元素为 top,top 的下面一个元素是 left,则一定有 height[left]≥height[top]。

2.如果 height[i]>height[top],则得到一个可以接雨水的区域,该区域的宽度是 i−left−1,高度是 min(height[left],height[i])−height[top],根据宽度和高度即可计算得到该区域能接的雨水量。

3.为了得到 left,需要将 top 出栈。在对 top 计算能接的雨水量之后,left 变成新的 top,重复上述操作,直到栈变为空,或者栈顶下标对应的 height 中的元素大于或等于 height[i]。

4.在对下标 i 处计算能接的雨水量之后,将 i 入栈,继续遍历后面的下标,计算能接的雨水量。遍历结束之后即可得到能接的雨水总量。

 法三:双指针

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        while (left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if (height[left] < height[right]) {
                ans += leftMax - height[left];
                ++left;
            } else {
                ans += rightMax - height[right];
                --right;
            }
        }
        return ans;
    }
}

1.初始化leftMax和rightMax=0.用于记录每次的最左边最大值和最右边最大值

2.在l<r的情况下循环,找到每一次的最左边最大值,和最右边最大值。

3.如果左边的比右边小(低),那么加上雨水的值为leftMax减去此时left的高度。并left++

4.如果右边的比左边小(低),那么加上雨水的值为rightMax减去此时right的高度。并right--

5.循环完毕之后通过累加我们就得到了最终答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习Day18:基础篇8

多态 基本信息&#xff1a; 应用场景&#xff1a; 可以把子类对象赋值给父类对象&#xff0c;实现多态从而使用同一种方法&#xff1b; 多态中调用成员的特点 1.调用成员变量都看左边 调用成员变量:编译看左边&#xff0c;运行也看左边 编译看左边: javac编译代码的时候&a…

【BSV生态亮点】体育进入区块链时代:波兰奥委会与Zetly建立战略伙伴关系

​​发表时间&#xff1a;2024年7月18日 波兰奥运委员会和Zetly宣布正式建立战略伙伴关系。这一合作是波兰将现代技术、数字资产和创新解决方案整合到波兰体育中的重要一步&#xff0c;将把波兰体育产业带入数字时代。 Zetly是一个非常活跃的数字平台&#xff0c;它将体育与区…

3.6.锚框

锚框 ​ 13.4. 锚框 — 动手学深度学习 2.0.0 documentation (d2l.ai) ​ 一类目标检测算法是基于锚框的&#xff0c;步骤如下&#xff1a; ​ 使用多个被称为锚框的区域(边缘框)&#xff0c;预测每个锚框里是否含有关注的物体&#xff0c;如果有&#xff0c;则预测从这个锚…

双指针-【3,4,5,6,7,8】

第三题&#xff1a;快乐数 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想&#xff1a; 1.每个…

jdk版本管理利器-sdkman

1.什么是sdkman&#xff1f; sdkman是一个轻量级、支持多平台的开源开发工具管理器&#xff0c;可以通过它安装任意主流发行版本&#xff08;例如OpenJDK、Kona、GraalVM等等&#xff09;的任意版本的JDK。通过下面的命令可以轻易安装sdkman: 2.安装 curl -s "https://…

IFM易福门LR3000LR3300液位传感器操作说明

IFM易福门LR3000LR3300液位传感器操作说明

使用ssh-remote连接远程vscode运行yolo项目时的一点坑

使用ssh-remote连接远程vscode运行yolo项目时的一点坑 1.坑1 因为我是直接下载的release包&#xff0c;然后运行 pip install -e .来下载依赖的&#xff0c;那么这个时候需要使用YOLO时都需要在下载的release文件的目录下的py文件才能生效 比方说我下载的yolov8(ultralytic…

SpringBoot 快速上手

1. 环境准备 ⾃检Idea版本: 社区版: 2021.1 -2022.1.4 专业版: ⽆要求 如果个⼈电脑安装的idea不在这个范围, 需要卸载重新安装. Idea 卸载参考: https://blog.csdn.net/qq_19072921/article/details/126408402 (⼀定要删除注册表) 2. Maven 2.1 什么是Maven 官⽅…

Stable Diffusion 模型的安装和使用

一、SD模型简介 Stable Diffusion的绘图风格主要由模型来控制&#xff0c;基础模型主要由二次元图片训练获得&#xff0c;所以在不安装其他模型的情况下&#xff0c;只能生成二次元风格的图像。 模型能够有效地控制生成的画风和内容。 常用的模型网站有&#xff1a; Stable D…

Taro 框架中使用iconfont 阿里巴巴矢量图标 class版

想必大家都知道这个图标库的 图标还是很多的‘ 大家应该都也用过 最进开发 Taro nut-ui 的H5 移动端的时候 我发现一些图标我在组件库中找不到 我看到了nut-ui 中还有另一种使用方法 这个叫做 自定一图标 、 我来用实际操作 代码 来介绍一下 这个怎么使用 我总结文章 …

docker环境安装kafka/Flink/clickhouse镜像

1、安装Kafka服务 1、将一下三个tar文件复制到ubuntu指定目录下 2、进入到/home/cl/app目录&#xff0c;使用docker命令加载tar镜像文件 # cd /home/cl/app # docker load -i kafka.tar # docker load -i kafka-manager.tar # docker load -i kafka-zookeeper.tar3、查看d…

MySQL基础练习题11-换座位

题目&#xff1a;交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。按 id 升序 返回结果表。 准备数据 分析数据 方法一&#xff1a;利用power函数对id进行交换&#xff0c;得出的答案只有0或1 第一步&#xff1a;用power()函数将…

HDBaseT远距离无压缩传输系统源头厂家

HDBaseT双绞线延长器是一款集成HDBaseT的远距离高清信号无压缩、无延时传输器&#xff0c;HDMI信号从接收端输出&#xff0c; 信号分辨率高达4Kx2K可以通过单根CAT5/CAT6网线将信号长距离传输高清无压缩音视频信号&#xff0c; 采用单根网线最远可传输70/100米&#xff0c; …

Linux 安装 nacos 2.4.0

参看&#xff1a;Nacos 快速开始 2.4.0 版本是Nacos2.X的又一个功能性版本&#xff0c;此版本的更新主要在 Nacos 的安全性、扩展功能和改进用户体验方面的持续努力&#xff0c;为用户提供了更安全、更灵活的服务管理平台。版本主要的功能如下&#xff1a; 增强安全性&#xf…

Duix AI 太上瘾,让我熬夜体验的AI女友

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Duix AI 太上瘾&#xff0c;让我熬夜体验的AI女友 开启 Duix AI 女友的奇妙之旅_ Hi&#xff0c;这…

C++:类和对象2

1.类的默认成员函数 默认成员函数就是用户没有显示实现编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们在不写的情况下编译器会默认生成6个默认成员函数&#xff0c;分别是构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数&#xff0c;拷贝赋值运算…

前缀和与差分大总结!!!C++

学了忘忘了学o(╥﹏╥)o 题源acwing 讲解前缀和一维&#xff0c;用于序列二维&#xff0c;用于矩阵 讲解差分什么是差分数组&#xff1f;一维差分数组二维差分数组 题目一&#xff1a;前缀和题目二&#xff1a;子矩阵的和题目三&#xff1a;差分题目四&#xff1a;差分矩阵 讲…

案例分享-国外轻松感UI设计赏析

国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式&#xff0c;减少用户的认知负担&#xff0c;从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息&#xff0c;降低操作难度&#xff0c;提升整体满意度。 在注重美观的同时&#xff0c;更加重视用户…

便携移动工作站,端侧 AI 大模型设备折腾笔记:ROG 幻 X 和 4090 扩展坞

为了本地测试和开发更丝滑&#xff0c;最近入手了一套新设备 ROG 幻 X Z13 和 ROG XG Mobile 4090 扩展坞。 基于这套设备&#xff0c;我搭了一套 Windows x WSL2 x CUDA 的开发环境。分享一下折腾记录&#xff0c;或许对有类似需求的你也有帮助。 写在前面 最近因为各种事情…

【MySQL】索引 【下】{聚簇索引VS非聚簇索引/创建主键索引/全文索引的创建/索引创建原则}

文章目录 1.聚簇索引 VS 非聚簇索引经典问题 2.索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引索引创建原则 1.聚簇索引 VS 非聚簇索引 之前介绍的将所有的数据都放在叶子节点的这种存储引擎对应的就是 InnoDB 默认存储表数据的存储结构。 …