LeetCode 84. Largest Rectangle in Histogram
Solution1:我的答案
循环里头套了一个动态规划,缺点是当heights个数或最大高度多高时会很耗时间!!!运行至第37个case时超时了….
还是记录一下。。。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
if (n == 0) return 0;
else if (n == 1) return heights[0];
int height_max = INT_MIN;
set<int> res;
for (int i = 0; i < heights.size(); i++) height_max = max(height_max, heights[i]);
for (int i = 0; i <= height_max; i++) {
int temp = 0, temp_max = INT_MIN;
vector<int> dp(n, 0);
for (int j = 0; j < n; j++) {//DP,思路与在0、1组成的字符串里求最长1的串思路相同
if (heights[j] < i)
temp = 0;
else {
temp += i;
dp[j] = temp;
}
temp_max = max(temp_max, dp[j]);
}
res.insert(temp_max);
}
return *(--res.end());
}
};
Solution2:
参考网址:http://www.cnblogs.com/grandyang/p/4322653.html
每找到一个局部峰值,然后向前遍历所有的值,算出共同的矩形面积,每次对比保留最大值。
相当于只在每个峰值和下坡路上遍历,按理说复杂度是
O(n2)
O
(
n
2
)
。但是确实很快而且可以AC。。。
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
int res = 0;
for (int i = 0; i < height.size(); ++i) {
if (i + 1 < height.size() && height[i] <= height[i + 1]) {//若把这个判断条件去掉,则是暴力算法复杂度是O(n^2),只有最后一个case无法AC
continue;
}
int minH = height[i];
for (int j = i; j >= 0; --j) {
minH = min(minH, height[j]);
int area = minH * (i - j + 1);
res = max(res, area);
}
}
return res;
}
};
正如注释中所说,此算法和暴力的时间复杂度相同,而暴力算法也只是最后一个case超时而已,不过只在峰值和下坡路上遍历确实很适合AC最后一个case…