首页 > 编程语言 >代码随想录算法训练营第四十六天| 84.柱状图中最大的矩形

代码随想录算法训练营第四十六天| 84.柱状图中最大的矩形

时间:2023-08-05 10:22:04浏览次数:40  
标签:第四十六 随想录 back st 柱状图 indexs heights 节点 size

 

84.柱状图中最大的矩形

要求:

有多个矩形,要求返回可能勾勒出的最大矩形

思路:

寻找右边第一个小于当前节点的index 寻找左边第一个小于当前节点的index   右边:累加的方式,如果当前节点小于,那么判读后放进去 左边,放进去了之后,当前节点后一个,就是左边最小的

代码:

 1 // 要求:和相邻节点比对,找出最大的面积
 2 // 
 3 // 难点:大于等于当前节点连续的柱子长度
 4 // 思路:左边第一个小于当前节点的,和右边第一个小于当前节点的
 5 // 
 6 // 高度:当前节点
 7 // 长度:左边第一个小于当前节点的 右边第一个小于当前节点
 8 //
 9 int largestRectangleArea(vector<int>& heights) {
10     if (heights.size() == 1)return heights[0];
11 
12     int result = 0;
13     vector<int> right_indexs(heights.size(), heights.size());
14     vector<int> left_indexs(heights.size(), -1);
15     deque<int> st;
16 
17     st.push_back(0);
18     for (int i = 1; i < heights.size(); i++)
19     {
20         if (heights[i] < heights[st.back()])
21         {
22             while (!st.empty() && heights[i] < heights[st.back()])
23             {
24                 right_indexs[st.back()] = i;
25                 st.pop_back();
26             }
27         }
28 
29         if (st.empty()) left_indexs[i] = -1;
30         else left_indexs[i] = st.back();
31 
32         st.push_back(i);
33     }
34 
35 
36     for (int i = 0; i < heights.size(); i++)
37     {
38         cout << left_indexs[i] << " " << right_indexs[i] << endl;
39         int cur = heights[i] * (right_indexs[i] - left_indexs[i] -1);
40 
41         result = result > cur ? result : cur;
42     }
43 
44     return result;
45 }

 

 

标签:第四十六,随想录,back,st,柱状图,indexs,heights,节点,size
From: https://www.cnblogs.com/smartisn/p/17607583.html

相关文章

  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    232.用栈实现队列   卡哥建议:大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。  题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html   做题思路:   记住栈和队列的......
  • [代码随想录]Day09-栈与队列part01
    题目:232.用栈实现队列思路:因为go没有栈和队列的类型,直接自己写就行了。比较简单的实现,具体看代码中的注释。代码:typeMyQueuestruct{numbers[]int}funcConstructor()MyQueue{returnMyQueue{numbers:[]int{}}}func(this*MyQueue)Push(xint){......
  • 代码随想录算法训练营第六天|力扣454.四数相加II、力扣383.赎金信、力扣15.三数之和、
    四数相加II(力扣454.)前两个数组的值直接遍历,并将和存入map中,key为和,value为出现次数后两个数组再次遍历,在map中寻找是否存在0-(c+d),若存在,count+=valuefor(a:A){//遍历ABfor(b:B){map[a+b]++;}}//insert操作for(c:C){for(d:D){target=0-(c+d);if(map.containsKey(t......
  • 代码随想录算法训练营第四十五天| 503.下一个更大元素II 42. 接雨水
    503.下一个更大元素II 要求:数组是环,需要找到下一个最大的元素思路1:先作为直线遍历,然后没有的节点,放到首部,再找比他大的节点注意:头节点代码:1//要求:返回循环数组中下一个更大的数字步数2//思路:先不循环遍历,3//然后对每个-1节点,以他为起始,放到数组的开头,计算有几......
  • 代码随想录算法训练营第九天| 复习字符串和双指针法(看卡哥文章复习)
     KMP算法就是在一个字符串中寻找另一个子串,避免了“跳回下一个字符再重新匹配”,实现了在一次字符串的遍历过程中就可以匹配出子串。28. 实现 strStr()  (本题可以跳过)     卡哥建议:因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的......
  • Python绘制多种形式的条形图(柱状图)
    绘图前的准备因为涉及到中文显示,所以需要用两行代码解决中文乱码问题importnumpyasnpfrommatplotlibimportpyplotaspltplt.rcParams['font.sans-serif']=[u'SimHei']#SimHei就是中文字体#因为设置了中文后,负号就乱码了,所以还要设置负号的编码plt.rcParams['axes.......
  • [代码随想录]Day07-字符串 part01
    题目:344.反转字符串思路:每次把最前面和最后面的交换位置即可strings库里没有反转的方法——这个反转是之后几个题的一个基础代码:双指针调换位置funcreverseString(s[]byte){l,r:=0,len(s)-1//最前面的元素,最后面的元素forl<r{s[l],s[......
  • 代码随想录算法训练营第四十三天| 583. 两个字符串的删除操作 72. 编辑距离
    583.两个字符串的删除操作要求:删除最少的步数,来让这两个字符串相等思路:求末尾的最长公共子序列的长度,然后减去他们的长度代码:1//要求:两个字符串,删除任意一个字符后,让这两个字符相等2//dp[n][m]以n-1结尾的字符串变成节点为m-1为子序列的最大个数3//4//求......
  • 代码随想录算法训练营第四十一天| 1143.最长公共子序列 1035.不相交的线 53. 最大
    1143.最长公共子序列  要求:可以跳过,找出来最长符合的节点难点:如何跳过了之后仍然保留之前的值思路:如果不符,并不是dp[i-1][j-2]等于之前的值,而是dp[i][j]等于它的相关节点以上很重要代码:1//要求:两个子数组,可以删减跳过,找出最长的长度2//思路:dp[n][m]代表第......
  • 代码随想录算法训练营第五天|力扣242.有效的字母异位词、力扣242.两个数组的交集、力
    哈希表哈希表理论基础哈希表,又称为散列表(HashTable),是根据关键码的值而直接进行访问的数据结构其中,数组就是一张哈希表;表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素哈希表解决的问题:一般哈希表都是用来快速判断一个元素是否出现在集合中哈希函数:把学生的......