LeetCode
84. 柱状图中最大的矩形
这道题的思路很明确,首先遍历整个数组,找到数值最小元素的位置和值,那么包含这个位置的矩形的最大高度只能是这个最小值,矩形的宽度最大为整个数组的长度,能够存在的更大的矩形只能是不包含这个位置的其他矩形,即在最小位置的左侧和右侧分别进行以上操作,直到数组边界位置,用递归来解决,不断松弛最大矩形的面积。
参考快速排序的时间复杂度,算法时间复杂度为O(nlogn).
class Solution {
public:
void dfs(vector& heights,int &ans,int l,int r)
{
int minn=-1,minid=1;
for(int i=l;i<=r;i++)
{
if(minn==-1)
{
minn=heights[i];
minid=i;
}
if(minn>heights[i])
{
minn=heights[i];
minid=i;
}
}
ans=max(ans,minn*(r-l+1));
if(minid-1>=l)dfs(heights,ans,l,minid-1);
if(minid+1<=r)dfs(heights,ans,minid+1,r);
return;
}
int largestRectangleArea(vector& heights) {
int n=heights.size();
int ans=0;
if(n==0)return ans;
int l=0,r=n-1;
int minn=-1,minid=-1;
for(int i=0;iheights[i])
{
minn=heights[i];
minid=i;
}
}
ans=max(ans,minn*(r-l+1));
if(minid-1>=0)dfs(heights,ans,l,minid-1);
if(minid+1
85. 最大矩形
这道题需要进行一个预处理,首先从倒数第二行开始直到第一行,如果matrix[i][j]=1,那么matrix[i][j]+=matrix[i+1][j],即通过o(nm)的预处理来获得每个位置及其下方连续的1的个数,预处理完之后我们可以发现,每一行都形成了上一题中的柱状图数组,那么调用n次柱状图数组即可求得最大面积。
算法的时间复杂度为O(nmlog(m))
class Solution {
public:
void dfs(vector& heights,int &ans,int l,int r)
{
int minn=-1,minid=1;
for(int i=l;i<=r;i++)
{
if(minn==-1)
{
minn=heights[i];
minid=i;
}
if(minn>heights[i])
{
minn=heights[i];
minid=i;
}
}
ans=max(ans,minn*(r-l+1));
if(minid-1>=l)dfs(heights,ans,l,minid-1);
if(minid+1<=r)dfs(heights,ans,minid+1,r);
return;
}
int largestRectangleArea(vector& heights) {
int n=heights.size();
int ans=0;
if(n==0)return ans;
int l=0,r=n-1;
int minn=-1,minid=-1;
for(int i=0;iheights[i])
{
minn=heights[i];
minid=i;
}
}
ans=max(ans,minn*(r-l+1));
if(minid-1>=0)dfs(heights,ans,l,minid-1);
if(minid+1>& matrix1) {
int n=matrix1.size();
if(n==0)return 0;
int ans=0;
int m=matrix1[0].size();
vector> matrix(n);
for(int i=0;i=0;i--)
{
for(int j=0;j
221. 最大正方形
这道题同上题一样进行预处理,不同之处在于答案的更新上,在更新ans之前比较当前矩形高度和长度的关系,如果高度大于长度,那么跳出递归(因为后续的高度肯定高于当前高度,后续宽度肯定小于当前宽度,也就是说后续肯定无解),如果高度小于等于长度,那么ans=minheight*minheight,其他同上题一样。
算法的时间复杂度为O(nmlog(m))
class Solution {
public:
void dfs(vector& heights,int &ans,int l,int r)
{
int minn=-1,minid=1;
for(int i=l;i<=r;i++)
{
if(minn==-1)
{
minn=heights[i];
minid=i;
}
if(minn>heights[i])
{
minn=heights[i];
minid=i;
}
}
if(minn<=r-l+1)ans=max(ans,minn*minn);
else return;
if(minid-1>=l)dfs(heights,ans,l,minid-1);
if(minid+1<=r)dfs(heights,ans,minid+1,r);
return;
}
int largestRectangleArea(vector& heights) {
int n=heights.size();
int ans=0;
if(n==0)return ans;
int l=0,r=n-1;
int minn=-1,minid=-1;
for(int i=0;iheights[i])
{
minn=heights[i];
minid=i;
}
}
if(minn<=r-l+1)ans=max(ans,minn*minn);
else return 0;
if(minid-1>=0)dfs(heights,ans,l,minid-1);
if(minid+1>& matrix1) {
int n=matrix1.size();
if(n==0)return 0;
int ans=0;
int m=matrix1[0].size();
vector> matrix(n);
for(int i=0;i=0;i--)
{
for(int j=0;j