您的位置:首页 > 其它

LeetCode: Largest Rectangle in Histogram

2013-04-02 05:11 441 查看
没想出来,看了网上答案再改了改

class Solution {
public:
struct node {
int left;
int right;
};
int largestRectangleArea(vector<int> &height) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = height.size();
vector<struct node> record(n);
for (int i = 0; i < n; i++) {
record[i].left = i;
while (record[i].left > 0 && height[i] <= height[record[i].left-1])
record[i].left = record[record[i].left-1].left;
}
for (int i = n-1; i >= 0; i--) {
record[i].right = i;
while (record[i].right < n-1 && height[i] <= height[record[i].right+1])
record[i].right = record[record[i].right+1].right;
}
int largest = 0;
for (int i = 0; i < n; i++)
largest = max(largest, height[i] * (record[i].right - record[i].left + 1));
return largest;
}
};


再贴段容易理解的代码

class Solution {
public:
int largestRectangleArea(vector<int> &h) {
stack<int> S;
h.push_back(0);
int sum = 0;
for (int i = 0; i < h.size(); i++) {
if (S.empty() || h[i] > h[S.top()]) S.push(i);
else {
int tmp = S.top();
S.pop();
sum = max(sum, h[tmp]*(S.empty()? i : i-S.top()-1));
i--;
}
}
return sum;
}
};


C#

public class Solution {
public int LargestRectangleArea(int[] height) {
Stack<int> S = new Stack<int>();
int[] heights = new int[height.Length+1];
int sum = 0;
Array.Copy(height, heights, height.Length);
for (int i = 0; i < heights.Length; i++) {
if (S.Count == 0 || heights[i] > heights[S.Peek()]) S.Push(i);
else {
int peek = S.Peek();
S.Pop();
sum = Math.Max(sum, heights[peek]*(S.Count == 0? i : i-S.Peek()-1));
i--;
}
}
return sum;
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: