LeetCode 接雨水 木桶理论、dp预处理

2023-09-22 11:12:21

原题链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题面:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 10^4
  • 0 <= height[i] <= 10^5

解题思路:

木桶理论,即每一列能够存储的水有关于左边最高的柱子和右边最高的柱子之间的较小者。

只要能够想到这一点,那么这题就不存在什么难度了。是一道较为简单的hard题呢。

考虑按列求。

height[i]为当前列柱子高度。

设left[i]代表柱子i左边最高的柱子,转移方程为left[i] = max(left[i - 1], height[i - 1]);

设right[i]代表柱子i右边最高的柱子,转移方程为right[i] = max(right[i + 1], height[i + 1])。

先从右往左遍历求出right,至于left,我们在求答案的时候可以顺便求。

设h = min(left[i], right[i]),即左边最高的柱子和右边最高的柱子之间的较小者。如果h大于height[i],则这一列能够存储的水量为h - height[i],如果h不大于height[i],则这一列存储不了水。

代码(CPP):

class Solution {
public:
    int left[20010];    // 每个柱子左边最高的柱子
    int right[20010];   // 每个柱子右边最高的柱子
    /*
        木桶理论
    */
public:
    int trap(vector<int>& height) {
        int n = height.size();
        int ans = 0;
        // 预处理每个柱子右边最高的柱子
        right[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            right[i] = max(right[i + 1], height[i + 1]);
        }
        // 左边最高的柱子在遍历时顺便求出
        left[0] = height[0];
        for (int i = 1; i < n - 1; i++) {
            // 左边最高的柱子
            left[i] = max(left[i - 1], height[i - 1]);
            // 左边最高的柱子和右边最高的柱子,较矮的那个
            int h = min(left[i], right[i]);
            if (h > height[i]) {
                ans += h - height[i];
            }
        }
        return ans;
    }
};

更多推荐

如何无损压缩视频?这些技巧你一定用得到

在日常生活中,我们常常会遇到视频文件过大、手机或电脑存储空间不足的情况。这时候,我们就需要将这些视频文件的内存进行压缩,以节省空间。但是,一个一个地压缩视频文件显然是不现实的。那么,如何快速批量压缩视频呢?接下来,本文将为大家介绍一种方法,让您轻松实现批量压缩视频的梦想。首先,我们需要进入“固乔科技”的官网,下载并安装

如何运用API接口获取淘宝1688京东商品数据:从入门到实践

一、引言随着电子商务的飞速发展,许多电商平台提供了API接口,允许开发者获取商品数据,以创建各种创新的应用。本文将详细介绍如何使用API接口获取商品数据,并通过代码示例进行演示。二、API接口概述1.API接口定义API(ApplicationProgrammingInterface)接口是一种协议,允许不同的应用程序

企业电子招投标采购系统——功能模块&功能描述+数字化采购管理 采购招投标

功能描述1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所有的立项信息。主要功能包含:招标立项申请、非招标立项申请、采购立项管理。3、采购项目管理:可对项目采购过程全流程管

PageHelp插件在复杂sql下引起的Having无法识别错误及其解决方案

1:问题出现的场景系统中有一个复杂SQL内嵌套了多个子查询.在改动时需要将SQL的最后一行加上having来做额外的过滤处理.添加完having语句后发现SQL能够正常执行就直接将代码提交到了测试环境.结果在测试环境报错Unknowncolumn‘xxx‘in‘havingclause.2:分析问题1:经过日志获取SQ

vue管理系统列表行按钮过多, 封装更多组件

管理系统table列表操作列,随着按钮的数量越来越多会不断加宽操作列,感觉很不好,对此我封装了这个自动把多余的按钮放到更多菜单下MoreOperation/index.vuemenu组件我这是ant的,可以自行替换为其他框架的<template><divclass="table-operations-group"><t

flyway适配高斯数据库

文章目录flyway适配高斯数据库flyway适配高斯数据库flyway-core源码版本:6.2.2tag由于高斯和postgresql使用的驱动都是一样的,所以基于flyway支持已有的postgresql数据库来改造修改点如下:1、PostgreSQLConnection类中的doRestoreOriginalS

抖音seo源码关键词霸屏搜索

抖音seo源码mvg框架依据关键词霸屏搜索引擎机制技术代开发,抖音seo优化系统,抖音seo优化系统最终也是类比百度seo关键词霸屏搜索引擎来搭建,从短视频ai创意制作,发布,多账号平台管理。1:抖音SEO霸屏系统的简介抖音SEO霸屏系统,是一款专为抖音视频创作者和传播者量身打造的视频编辑软件。使用抖音SEO霸屏系统可

leetcode:118. 杨辉三角

一、题目函数原型:int**generate(intnumRows,int*returnSize,int**returnColumnSizes)参数解析:numRows是指明要求前几行杨辉三角returnSize是返回指针数组的元素个数returnColumnSizes是指明杨辉三角每一行有几个元素二、思路既然需要函数

Go 文件操作

创建文件将数据存储到文件之前,先要创建文件。GO语言中提供了一个Create()函数专门创建文件。该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。创建文件的步骤:

使用vue-cli搭建spa项目

目录什么是vue-cli安装vue-cli使用脚手架vue-cli(来构建项目)vue项目结构的说明基于spa项目完成路由基于spa项目完成嵌套路由什么是vue-cliVueCLI是一个官方发布的用于快速搭建Vue.js项目的命令行工具。它提供了一套交互式的脚手架,可以帮助开发者初始化项目、配置构建工具、管理依赖等。安

【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透

文章目录前言1.下载Gitlab2.安装Gitlab3.启动Gitlab4.安装cpolar5.创建隧道配置访问地址6.固定GitLab访问地址6.1保留二级子域名6.2配置二级子域名7.测试访问二级子域名前言GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。G

热文推荐