求解最大矩形,很容易想到O(n^2)的解法,只需要求解max(min(height(i...j)*(j-i+1))),0<=i<=j<n;
class Solution { public: int largestRectangleArea(vector<int> &height) { int ans=0,tans=0,len=height.size(); for(int i=0;i<len;i++){ int minh=height[i]; for(int j=0;j<=i;j++){ if(height[j]<minh)minh=height[j]; tans=(j-i+1)*minh; if(tans>ans)ans=tans; } } return ans; }
但是对于大的数据超时,通过用栈记录记录,从而将空间复杂度由O(1)到O(n),以空间换时间,将时间复杂度降到O(n)
class Solution { public: int largestRectangleArea(vector<int> &height) { int len=height.size(); if(len==0)return 0; stack<int >st; stack<int >index; int ans=0,tans=0; for(int i=0;i<len;i++){ if(st.empty()||height[i]>st.top()){//递增的话,放入 st.push(height[i]); index.push(i); }else if(st.top()>height[i]){//出现降序 int tindex=0; while(!st.empty()&&height[i]<st.top()){//计算山头部分的值 tindex=index.top(); index.pop(); tans=st.top()*(i-tindex); st.pop(); if(tans>ans)ans=tans;//记录最大 } st.push(height[i]);//记录 index.push(tindex); } } while(!st.empty()){//最后计算各个极小值情况 int tindex=index.top(); index.pop(); tans=st.top()*(len-tindex); st.pop(); if(tans>ans)ans=tans; } return ans; } };