[LeetCode] Largest Rectangle in Histogram
第一种方法,暴力求解,从当前向左右两个方向扫描比自己小的,然后计算面积,时间复杂度O(n^2)code如下,但是在LeetCode上回超时。
1 class Solution { 2 public: 3 int largestRectangleArea(vector<int> &height) { 4 5 int size = height.size(); 6 int left = 0, right = 0, area = 0; 7 8 for(int i = 0; i < size; i++) 9 { 10 int j; 11 for( j = i-1; j>= 0;j--) 12 { 13 if(height[j] <height[i]) 14 { 15 left = j; 16 break; 17 } 18 } 19 20 for(j = i+1; j<size; j++) 21 { 22 if(height[j] <height[i]) 23 { 24 right = j; 25 break; 26 } 27 } 28 29 area = max(area, height[i] * (right - left -1)); 30 } 31 32 return area; 33 34 } 35 };
第二种方法,对于每一个height[i],第一种方法用暴力查找的方法找它的左右边界,我们可以用一个stack来实现其左右边界的查找。我们维持一个递增的栈,由于是递增的,后压入栈的都比前面的大,所以其左边界就确定了,我们要做的是找右边界。当某一个height[j]小于当前栈顶元素时,就找到了右边界,则将计算以当前栈顶元素计算为高得面积;如果下一个栈顶元素还是大于height[j],则仍要计算面积,以此类推,知道最后,我们一下图举例。
对原有的height在末尾压入0.
初始,stack为空,
i = 0, push idx=0 into stack;
i = 1, height[1] = 7 > height[stack.top()] = 2, push idx=1 into stack;
i = 2, height[2] = 5 < height[stack.top()] = 7,pop idx=2 from stack, calc area = (i-stack.top()-1)*height[idx] = (2-0-1)*7=7;
height[2] = 5 > height[stack.top()] = 2, stop to calc area and push 5 into stack.
i = 3, height[3] = 6 > height[stack.top()] = 5, push idx = 3 into stack;
i = 4, height[4] = 4 < height[stack.top()] = 6, pop idx = 3 from stack, calc area = (i-stack.top()-1)*height[idx]= (4-2-1)*6=6,
height[4] = 4 < height[stack.top()] = 5, pop idx =2 from stack, calc area =(i-stack.top()-1)*height[idx]=(4-0-1)*5=15,
height[4] = 4 > height[stack.top()] = 2, push idx= 4 into stack;
i = 5 height[5] = 0 < height[stack.top()] = 2, pop idx =0 form stack, calc area = i*height[idx]= 5 * 2 = 10;
所以最大面积为15.
1 class Solution { 2 public: 3 int largestRectangleArea(vector<int> &height) { 4 5 //add 0 to the end 6 height.push_back(0); 7 8 int size = height.size(); //this new_size is 1 + old_size 9 stack<int> st; 10 11 int max_area = 0; 12 13 14 15 for(int i = 0; i< size; ) 16 { 17 if(st.empty() || height[i] > height[st.top()]) 18 { 19 st.push(i); 20 i++; 21 } 22 else 23 { 24 //st must be not empty here 25 // i can't ++; handle many times perhaps 26 27 int idx = st.top(); 28 st.pop(); 29 30 int area; 31 32 if(st.empty()) 33 { 34 area = height[idx] * i; 35 } 36 else 37 { 38 area = height[idx] * (i-st.top()-1); 39 } 40 41 max_area = max(max_area, area); 42 43 } 44 } 45 return max_area; 46 } 47 }; 48 f