首页 > 其他分享 >[代码随想录]Day52-单调栈part03

[代码随想录]Day52-单调栈part03

时间:2023-09-23 11:34:31浏览次数:30  
标签:part03 随想录 50 40 heights 60 70 Day52 stack

题目:84. 柱状图中最大的矩形

思路:

实现要确定一个核心问题:包含完整一个柱子的最大矩形要找到这根柱子左侧最后一个高于他的柱子以及右侧最后一个高于他的柱子的位置(等同于左侧第一个小于他,右侧第一个小于他,因为+1 -1就是)

只要get到一个点,比如:30 50 70 80 60 70 40 这一段柱子,在遍历到40时,栈内元素是 30 50 60,当遇到40时,60这个数就同时拥有了左侧最小值的位置(即50的位置),以及右侧最小值的位置(即40的位置),那么在50到60 以及 60 - 40之间的柱子都是大于60的(70,80 | 70)。也就是说在60这个高度上能取到的宽度就是4( 70 80 60 70 ),也就是说40的位置(6) - 50的位置(1) - 1 = 宽度(4)。

代码:

func largestRectangleArea(heights []int) int {
 	max := 0
 	stack := make([]int, 0)
 	heights = append([]int{0}, heights...)
 	heights = append(heights, 0)
	stack = append(stack, 0)
	for i := 1; i < len(heights); i++ {
        for heights[stack[len(stack)-1]] > heights[i] {
               mid := stack[len(stack)-1]
               stack = stack[0 : len(stack)-1]
               left := stack[len(stack)-1]
               tmp := heights[mid] * (i - left - 1)
               if tmp > max {
                	max = tmp
               }
          }
          stack = append(stack, i)
     }
     return max
}

参考:

代码随想录

力扣题解

标签:part03,随想录,50,40,heights,60,70,Day52,stack
From: https://www.cnblogs.com/wtcsky/p/17724061.html

相关文章

  • 代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.
    110.平衡二叉树classSolution{public:intgetHeight(TreeNode*node){if(node==NULL)return0;intleftHeight=getHeight(node->left);if(leftHeight==-1)return-1;intrightHeigh......
  • [代码随想录]Day51-单调栈part02
    题目:503.下一个更大元素II思路:总之就是走两次nums,可以拼接,也可以用下面的取余方式。代码:funcnextGreaterElements(nums[]int)[]int{lens:=len(nums)res:=make([]int,lens)fori:=0;i<lens;i++{res[i]=-1}stack:=make(......
  • 代码随想录算法训练营-贪心算法-5|56. 合并区间、738. 单调递增的数字、968. 监控二叉
    56. 合并区间时间复杂度:O(nlogn)空间复杂度:O(logn),排序需要的空间开销1classSolution:2defmerge(self,intervals):3result=[]4iflen(intervals)==0:5returnresult#区间集合为空直接返回67int......
  • [代码随想录]Day50-单调栈part01
    题目:思路:要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了维护一个栈顶->栈底由小到大的栈;这样在之后(右侧)遇到更大的数时,就可以得到所有在他前面并且比他小的数,就能获得结果。初始化默认为0;代码:funcdailyTemperatures(n......
  • 随想录Day1|704. 二分查找、27. 移除元素
    随想录Day1|704.二分查找、27.移除元素 704.二分查找LeetCode题目文章讲解视频讲解给定n个元素升序的整形数组nums和一个目标值target,写一个函数搜索nums中的target,如果存在目标值则返回下标,否则返回-1。其中nums中的元素不重复,n在[1,10000]之间,nums的每个元素都在[-......
  • [代码随想录]Day49-动态规划part17
    题目:647.回文子串思路:整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况情况一:下标i与j相同,同一个字符例如a,当然是回文子串情况二:下标i与j相差为1,例如aa......
  • [代码随想录]Day48-动态规划part16
    题目:583.两个字符串的删除操作思路:还是最长公共子序列,假设最长公共子序列长度是l;那么需要删除的次数是len(s1)-l+len(s2)-l代码:funcminDistance(word1string,word2string)int{lens1:=len(word1)lens2:=len(word2)dp:=make([][]int,lens1+......
  • 代码随想录算法训练营第十一天
    代码随想录算法训练营第十一天|LeetCode239(滑动窗口最大值)LeetCode347(前K个高频元素)239:滑动窗口最大值LeetCode239(滑动窗口最大值)importjava.util.Deque;importjava.util.LinkedList;classSolution{publicint[]maxSlidingWindow(int[]nums,intk)......
  • ## day13 - 栈与队列part03
    day13-栈与队列part03力扣239.滑动窗口的最大值思路:利用单调队列,很难想的出来。因为每次是进一个数,弹出一个数,因此没必要每次都进行排序,只需要拿到最大值即可。用单调队列实现,是一个双向队列pop()函数:如果要pop的值是队列头部的值,那么就弹出,否则不操作。push()函数:如果......
  • 代码随想录算法训练营day13| ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结
    239.滑动窗口最大值mydemo--(自己思路)--failed超出时间限制classSolution{public:vector<int>maxSlidingWindow(vector<int>&nums,intk){vector<int>result;stack<int>stack;intlen=nums.size();for(......