IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode42 接雨水 -> 正文阅读

[数据结构与算法]Leetcode42 接雨水

在这里插入图片描述

看到这个题我的第一反应就是使用暴力+动态规划,从左到右依次确定每个位置左右两边的最高值(leftmax和rightmax),至于怎么确定这里就用到了动态规划: 创建两个数组分别储存leftmax和rightmax(动态规划一般都要创建数组,以空间换时间).
leftmax的确定: 令leftmax[0] = height[0],然后从1开始正向遍历数组,通过Math.max(leftmax[i-1],height[i]),依次确定各个位置的leftmax。
rightmax同理令rightmax=height[i-1],从反向开始遍历。
最高值确定以后用Max.min(leftmax,rightmax)-height[i]这个公式就可以算出能接多少雨水

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if(n<2)  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;
    }
}

双指针

双指针法相较于动态规划空间复杂度更小,是O(1)级别的。我们只需要创建两个指针 l指针和 r指针 ,l指针只向左,r指针只向右。这样会出现四个变量l_leftmax 、l_rightmax 、r_leftmax 、r_rightmax。但实际上我们只需要维护 l_leftmax 和 r_rightmax 这两个变量即可,因为由于r>l,所以 l_leftmax <=r_leftmax ,l_rightmax > r_rightmax。 如果l_leftmax < r_rightmax ,则有l_leftmax < l_rightmax,所以l点可以接水,所以l点接的水就等于leftmax-height【l】,l指针++。反之 l_leftmax >= r_rightmax 则一定有 r_leftmax >=r_rightmax,r点可以接水,r点接的水等于rightmax - height【r】,r指针减减。从这我们就可以看到只需要判断l_leftmax 和 r_rightmax 这两个变量的大小就能确定该点是否能接水,能接多少水,所以我们只需要维护 l_leftmax 和 r_rightmax 这两个变量即可. 当两个指针 l和r对撞以后我们就可以确定能借多少水,就能得到我们想要的答案了

上面解释为什么只需要维护两个变量 l_leftmax 和 r_rightmax时由于使用的字母太多了,所以接下来再用图像解释一番。
在这里插入图片描述

class Solution {
    public int trap(int[] height) {
        int n = height.length,ans = 0;
        int l=0, r=n-1;    //确定l,r两个左右指针
        int l_leftmax = 0,r_rightmax = 0;
        while(l<r){
            l_leftmax = Math.max(l_leftmax,height[l]);
            r_rightmax = Math.max(r_rightmax,height[r]);
            if(l_leftmax < r_rightmax){
                ans +=l_leftmax - height[l];
                l++;
            }else{
                ans +=r_rightmax - height[r];
                r--;
            }
        }
        return ans;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:25:52  更:2022-03-17 22:28:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:42:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码