您的位置:首页 > 其它

LeetCode 84 Largest Rectangle in Histogram

2016-06-13 17:32 351 查看

问题

https://leetcode.com/problems/largest-rectangle-in-histogram/

解法1

枚举法, 时间复杂度O(n^2)

// TLE
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int ret = 0;
for (int i=0; i< heights.size(); ++i)
{
int L, R;
for (L =i; L >=0 && heights[L] >= heights[i]; --L);
++L;
for (R = i; R <heights.size() && heights[R] >= heights[i]; ++R);
--R;
ret = max(ret, (R+1-L) * heights[i]);
}
return ret;
}
};


解法2

使用堆栈优化, 时间复杂度N, 空间复杂度N

首先注意到, 包含位置i的最大结果一段是段头的前一个位置(start range)和段尾后一个位置(end ranger)为都比位置i小(或者是数组边界),比如[2,1,5,6,2,3, 1], 包含位置i = 4 则最大结果是 【5, 6, 2, 3】 ,段头的前一个位置1, 段尾后一个位置1都比2 小。我们枚举数组中的每一个位置K, 之前位置中比当前位置K 数大的位置最多扩展到当前位置K, 即当前位置K为这些位置的end range,如果我们使用堆栈记录所有没有求得最大值的位置, 则枚举到每个位置时, 栈中元素是按照升序排列, 此时栈中前一个位置,即为start range。

每次出栈时计算一次长度, 所有元素只会有一次出栈, 因此时间复杂度为N,需要有一个堆栈空间复杂度为N

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
heights.push_back(-1);
int ret =0;
for (int i=0; i<heights.size(); ++i)
{
while(s.size() && heights[i] < heights[s.top()])
{
int h = heights[s.top()];
s.pop();
int start = s.empty() ? -1:s.top();
ret = max(ret, h*(i - start -1));
}
s.push(i);
}
return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode