1 #include"000库函数.h"
  2 //一点头绪都没有
  3 //然后就自己按自己的意思来一遍
  4 //好像没有用算法
  5 //16ms,让我激动一把
  6
  7 class Solution {
  8 public:
  9     int trap(vector<int>& height) {
 10         if (height.size() < 2)return 0;
 11         int s = 0;//起始点
 12         int e = 0;//终止点
 13         int v = 0;//接雨水量
 14         int t = 0;//计算中间掠过的柱子
 15         int i, j;
 16         for (i = 0; i < height.size()-1; ++i) {
 17             if (height[i] < 1)continue;
 18             s = height[i];//找到非0点为起始点
 19             for (j = i + 1; j < height.size(); ++j) {
 20                 if (height[j] >= s) {//找到比起始点大或者相等的点
 21                     e = height[j];
 22                     break;
 23                 }
 24                 t += height[j];
 25                 if (j == height.size() - 1) {//没有比起始点小的数了
 26                     --s;//对s进行降高度
 27                     j = i;//重新遍历
 28                     t = 0;//重新计算中间掠过的柱子
 29                 }
 30             }
 31             v += (s < e ? s : e)*(j - i - 1) - t;//计算体积,记得减去中间的掠过体积
 32             t = 0;//下一步重新计算掠过的体积
 33             i = j - 1;//换过起始点(即终止点作为新的起始点)
 34         }
 35         return v;
 36     }
 37 };
 38
 39 //下面是看够力扣题解之后的答案
 40 //根据力扣上面的解题提示
 41 //尝试着做一下
 42 //使用暴力法进行解答
 43 //484ms
 44 class Solution {
 45 public:
 46     int trap(vector<int>& height) {
 47         int ans = 0;
 48         int size = height.size();
 49         for (int i = 1; i < size - 1; i++) {
 50             int max_left = 0, max_right = 0;
 51             for (int j = i; j >= 0; j--) { //Search the left part for max bar size
 52                 max_left = max(max_left, height[j]);
 53             }
 54             for (int j = i; j < size; j++) { //Search the right part for max bar size
 55                 max_right = max(max_right, height[j]);
 56             }
 57             ans += min(max_left, max_right) - height[i];
 58         }
 59         return ans;
 60     }
 61 };
 62 //
 63 //
 64 //使用动态规划20ms
 65 //
 66 class Solution {
 67 public:
 68     int trap(vector<int>& height) {
 69         if (height.size() == NULL)return 0;
 70         int ans = 0;
 71         int size = height.size();
 72         vector<int> left_max(size), right_max(size);
 73         left_max[0] = height[0];
 74         for (int i = 1; i < size; i++) {
 75             left_max[i] = max(height[i], left_max[i - 1]);
 76         }
 77         right_max[size - 1] = height[size - 1];
 78         for (int i = size - 2; i >= 0; i--) {
 79             right_max[i] = max(height[i], right_max[i + 1]);
 80         }
 81         for (int i = 1; i < size - 1; i++) {
 82             ans += min(left_max[i], right_max[i]) - height[i];
 83         }
 84         return ans;
 85     }
 86 };
 87 //
 88 //
 89 //使用堆栈法28ms
 90 //
 91 class Solution {
 92 public:
 93     int trap(vector<int>& height) {
 94         int ans = 0, current = 0;
 95         stack<int> st;
 96         while (current < height.size()) {
 97             while (!st.empty() && height[current] > height[st.top()]) {
 98                 int top = st.top();
 99                 st.pop();
100                 if (st.empty())
101                     break;
102                 int distance = current - st.top() - 1;
103                 int bounded_height = min(height[current], height[st.top()]) - height[top];
104                 ans += distance * bounded_height;
105             }
106             st.push(current++);
107         }
108         return ans;
109     }
110 };
111 //
112 //使用双指针法16ms
113 //
114 class Solution {
115 public:
116     int trap(vector<int>& height) {
117         int left = 0, right = height.size() - 1;
118         int ans = 0;
119         int left_max = 0, right_max = 0;
120         while (left < right) {
121             if (height[left] < height[right]) {
122                 height[left] >= left_max ? (left_max = height[left]) : ans += (left_max - height[left]);
123                 ++left;
124             }
125             else {
126                 height[right] >= right_max ? (right_max = height[right]) : ans += (right_max - height[right]);
127                 --right;
128             }
129         }
130         return ans;
131     }
132 };
133
134
135 void T042() {
136     Solution s;
137     vector<int>v;
138     v = { 0,1,0,2,1,0,1,3,2,1,2,1 };
139     cout << s.trap(v) << endl;
140     v = { 4,2,1,2,4 };
141     cout << s.trap(v) << endl;
142     v = { 0,4,0,3,0,2};
143     cout << s.trap(v) << endl;
144
145
146 }

转载于:https://www.cnblogs.com/zzw1024/p/10578399.html

力扣算法题—042接雨水相关推荐

  1. 程序员面试需要刷力扣算法题吗

    这里写目录标题 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一些特征 1.2. 为什么要考查算法 1.3. 目前面试主要考查 3 类 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一 ...

  2. LeetCode -- 力扣算法题解题心得 -- (个人笔记记录)持续更新~~

    一.前言 正式开启数据结构+算法研究的历程,准备好一年后的面试.下面的解法不一定是最优解,只求能力提升,会定期更新~~ 二.目录 1 2 19 20 21 24 35 42 83 86 94 96 1 ...

  3. “宝石与石头”:一道简单却巧妙的力扣算法题

    本篇博客会讲解力扣"771. 宝石与石头"的解题思路,这是题目链接. 先来审题: 以下是输出示例: 以下是提示: 本题可以使用数组模拟哈希表来实现.先把宝石字符串中的字符标识到数组 ...

  4. 力扣算法题-19.秋叶收藏集 C语言实现

    题目 小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片 ...

  5. 力扣算法题,第N个神奇数字(Python)

    878.第N个神奇数字 题目描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + ...

  6. 力扣算法题—075颜色分类

    给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...

  7. 力扣算法题—073矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [[1,0, ...

  8. 力扣算法题—074搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

  9. 力扣算法题(11)动态规划

    70-Climbing Stairs (fibonacci数的矩阵计算) //假设你正在爬楼梯,有n阶,每次可以爬1或2阶,有多少种方法可以爬到楼顶. class solution70{int res ...

最新文章

  1. 关于上传文件的跨域问题
  2. 最近对Allegro的几个总结
  3. 数据集-用于数据挖掘、信息检索、知识发现等
  4. 享元模式 - 结构型模式
  5. Intel XDK问题
  6. sysbench线程数_分享3个Sysbench性能压测脚本及多并发压测过程
  7. 异步 Action 的定义
  8. mysql subquery_mysql-8-subquery
  9. C++/MFC 串口通讯——光源控制器控制
  10. WEB入门.九 导航菜单
  11. 无线网服务器拒绝连接,网络拒绝连接什么原因
  12. 稻盛和夫:只有极度认真工作,才能扭转人生
  13. 《吊打面试官》系列-Redis基础
  14. AR体感游戏,体感互动游戏,AR大屏互动
  15. 发光细胞:小鼠活体成像工具细胞原理于应用实例
  16. Win10下Tensorflow-gpu使用cpu训练而不是gpu加速
  17. 搞数仓也得懂几个常用机器学习算法
  18. 使用python脚本批量修改vc工程文件
  19. K8S 生态周报| Helm v3.4 发布
  20. 压缩[SCOI2007]

热门文章

  1. Fiori学习笔记 - 服务跨域处理neo-app
  2. SSG框架Gatsby访问数据库,并显示到页面上
  3. 干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干干货
  4. Linux系统如何安装oki打印机,oki打印机驱动安装图解
  5. 【bzoj 5248】一双木棋
  6. tp3.2子域名部署
  7. 搞笑男女对白 不看后悔哦
  8. 【每日一题】031 神奇的6位数
  9. 新手自定义view练习实例之(一) 泡泡弹窗
  10. win电脑被安装垃圾软件后在注册表哪里卸载?