当前位置: 首页 > news >正文

当青训营遇上码上掘金之主题四-攒青豆


theme: juejin

在这里插入图片描述

攒青豆

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

image.png

以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17

解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

题解

这个和接雨水的题很相似
采用单调栈的做法
image.png

  • 先遍历每个的高度 前三个入栈 栈里面存的都是新来元素的下标 然后栈顶元素小于新加入的元素 栈顶元素出栈
  • 如果说栈里面还有元素 那么咱们需要的面积就是 底乘高
    底:当前遍历到的i - 现在栈顶元素-1
    高:首先新来的元素与当前栈的元素取最小 得出h1 (其实是为了知道A和B 二者中的最小) 然后h1与第一步出栈的元素相减 得出H
    面积就是 底* H
  • 答案要累加起来 当栈顶元素大于新来的元素时 栈里面添加元素
    最后输出答案
class Solution {
   public int trap(int[] height) {
       int n = height.length ;
       Stack<Integer> s = new Stack<>();
       int res = 0 ;
       for(int i = 0 ; i < n ; i++){
           while(s.size() > 0 && height[s.peek()] <= height[i]){
              int t =  s.pop();
               if(s.size() > 0){
                   int h = Math.min(height[s.peek()],height[i]);
                   res += (i - s.peek() - 1 )* (h-height[t]) ;
               }
           }
           s.push(i);
       }
       return res ;
   }
}

还有一种类似做法 和上面做法大同小异

题解2

这里面是分成了两部分内容 对上面的内容进行了拆解
当栈顶元素小于新来的元素的时候 ( last指的是现在栈的栈顶元素)

  • 出栈 然后面积的高 为原来和现在的栈顶元素之差
  • 等height[stack.peek()] > height[i]后来的面积的高为新来元素和现在栈顶元素的
    Stack<Integer> stack = new Stack<>();
    int result = 0;
    for (int i = 0; i < height.length; i++) {
        int last = 0;//这里面指的是现在栈的栈顶元素
        while (stack.size() != 0 && height[stack.peek()] <= height[i]) {
            result += ((height[stack.peek()] - last) * (i - stack.peek() - 1));
            last = height[stack.peek()];//更新成现在栈顶元素
            stack.pop();
        }
        if (stack.size() != 0) {
            result += ((height[i] - last) * (i - stack.peek() - 1));
        }
        stack.push(i);
    }
    return result;

 

相关文章:

  • 网站图片链接怎么做的/网络营销师证书需要多少钱
  • 男女直接做那个的视频网站/怎么进行推广
  • 泉州自助建站系统/怎样开自己的网站
  • 肥西县重点建设局网站/百度ai入口
  • 做网站宿迁/seo排名第一的企业
  • 网页版qq登录入口在哪里/网站内容优化方法
  • javaEE 初阶 — 文件内容的读写
  • Linux chattr命令
  • #9文献学习--基于元强化学习的边缘计算快速自适应任务卸载
  • 一篇文章带你学完JavaScript基础知识,超全的JavaScript知识点总结
  • react受控组件和非受控组件区别
  • 拐点检测常用算法总结
  • YonBuilder 应用构建教程之移动端扩展
  • 文本处理工具
  • Virtualbox设置固定IP
  • 基于云计算与深度学习的常见作物害虫识别
  • 数据量大也不卡的bi软件有哪些?
  • springboot整合log4j2