首页 > 编程语言 >代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形

代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形

时间:2024-08-08 21:54:58浏览次数:11  
标签:dateHeight int 随想录 height 柱状图 isEmpty Stack stack LeetCode

代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形

LeetCode(42)接雨水
题目
在这里插入图片描述

代码

import java.util.Stack;

class Solution {
    public int trap(int[] height) {
        //用单调栈进行操作
        int sum=0;
        Stack<Integer> stack=new Stack<>();
        for(int i=0;i<height.length;i++){
            if(stack.isEmpty()){
                stack.push(i);
            }else{
                while(!stack.isEmpty()&&height[i]>height[stack.peek()]){
                    int maxRight=i;
                    int middle=stack.peek();
                    stack.pop();
                    if(!stack.isEmpty()){
                        int maxLeft=stack.peek();
                        //计算面积
                        int tempHeight=0;
                        if(height[maxRight]>height[maxLeft]){
                            tempHeight=height[maxLeft];    
                        }else{
                            tempHeight=height[maxRight];
                        }
                        sum=sum+(tempHeight-height[middle])*(maxRight-maxLeft-1);//这里是减1
                    }
                }
                stack.push(i);
            }
        }
        return sum;

    }
}

LeetCode(84)柱状图中最大的矩形
题目
在这里插入图片描述

代码

import java.util.Stack;

class Solution {
    public int largestRectangleArea(int[] heights) {
        int maxArea=0;
        //最大面积,单调递减栈+首尾得增加两个0
        int[] dateHeight=new int[heights.length+2];
        dateHeight[0]=0;
        dateHeight[dateHeight.length-1]=0;
        for(int i=0;i<heights.length;i++){
            dateHeight[i+1]=heights[i];
        }
        Stack<Integer> stack=new Stack<>();//单调递减栈
        for(int i=0;i<dateHeight.length;i++){
            if(stack.isEmpty()){
                stack.push(i);
            }else{
                while (!stack.isEmpty()&&dateHeight[i]<dateHeight[stack.peek()]) {
                    int rightMin=i;
                    int mid=stack.peek();
                    stack.pop();
                    if(!stack.isEmpty()){
                        int leftMin=stack.peek();
                        if((rightMin-leftMin-1)*dateHeight[mid]>maxArea){
                            maxArea=(rightMin-leftMin-1)*dateHeight[mid];
                        }
                    }
                    
                }
                stack.push(i);
            }
        }
        return maxArea;

    }
}

标签:dateHeight,int,随想录,height,柱状图,isEmpty,Stack,stack,LeetCode
From: https://blog.csdn.net/m0_46478505/article/details/141036716

相关文章

  • 代码随想录算法训练营第64天 | 图论:Floyd 算法+A * 算法
    97.小明逛公园https://kamacoder.com/problempage.php?pid=1155Floyd算法精讲https://www.programmercarl.com/kamacoder/0097.小明逛公园.html#floyd-算法精讲Floyd算法精讲问题总结:双向道路;路径规划;多个起点到多个终点核心思想:动态规划确定dp数组和下标含义:grid......
  • LeetCode144 二叉树的前序遍历
    前言题目:144.二叉树的前序遍历文档:代码随想录——二叉树的递归遍历编程语言:C++解题状态:基础知识不了解思路两种思路,第一是递归。递归算法有三个要素。每次写递归,都按照这三要素来写!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就......
  • (leetcode学习)50. Pow(x, n)
    实现 pow(x,n) ,即计算x的整数 n次幂函数(即,xn)。示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2.00000,n=-2输出:0.25000解释:2-2=1/22=1/4=0.25提示:-100.0<x<100.0-231<=n<=231......
  • Leetcode: 1484. Groups Sold Products By The Date
    题目要求如下:输入的数据为要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序。下面是实现的代码:importpandasaspddefcategorize_products(activities:pd.DataFrame)->pd.DataFrame:val=activities.drop_duplicates().groupby("sell......
  • 代码随想录day23 || 39 组合总和,40 组合总和2,131 分割回文串
    39组合总和funccombinationSum(candidates[]int,targetint)[][]int{ //思路,组合问题考虑回溯算法,考虑到元素可能重复问题,所以,树的最大深度应该是target/min(candudates)+1 varpath=[]int{} varres=[][]int{} backtracking(target,candidates,&path,&res......
  • Leetcode: 586. Customer Placing the Largest Number of Orders
    题目要求如下:给出的例子如下:简单地说就是要找出表中订单最多客户的ID。使用如下的代码进行实现:importpandasaspddeflargest_orders(orders:pd.DataFrame)->pd.DataFrame:returnorders.groupby("customer_number").count().reset_index().nlargest(1,colum......
  • leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列
    leetcode718和leetcode1143两道十分相似的题,就不放题目了思路实际上区别就在于一个要求连续数组,另一个要求不连续的序列。二者的dp表达式和状态转移其实是不一致的,前者f[i][j]代表nums1以i结尾nums2以j结尾的最长子数组长度,后者代表nums1以i结尾nums2以j结尾的区间内存......
  • 代码随想录算法训练营第63天 | SPFA算法优化+变式
    94.城市间货物运输Ihttps://kamacoder.com/problempage.php?pid=1152Bellman_ford队列优化算法(又名SPFA)https://www.programmercarl.com/kamacoder/0094.城市间货物运输I-SPFA.html95.城市间货物运输IIhttps://kamacoder.com/problempage.php?pid=1153bellman_ford之判......
  • 「代码随想录算法训练营」第三十二天 | 动态规划 part5
    52.携带研究材料题目链接:https://kamacoder.com/problempage.php?pid=1052文章讲解:https://programmercarl.com/背包问题理论基础完全背包.html视频讲解:https://www.bilibili.com/video/BV1uK411o7c9/题目状态:看题解过思路:在0-1背包问题中,每个物品只能选择一次,即每个物品......
  • (nice!!!)LeetCode 3130. 找出所有稳定的二进制数组 II(动态规划dp)
    题目:3130.找出所有稳定的二进制数组II思路:大佬的思路classSolution{public:intmod=1e9+7;typedeflonglongLL;LLsta[1010][1010][2];//当前还有i个0、j个1时,第i+j的位置放置u,可以组成的合法数目LLdfs(inti,intj,intu,intlimit)......