leetcode 84柱状图中最大的矩形

浪尽此生 提交于 2020-01-27 08:14:01

在这里插入图片描述
在这里插入图片描述
一种很好理解的思路 (这种思路超出时间限制,最后一个测试用例过不了)就是以每个位置的高度作为高 向两边延伸(只有它左边或者右边位置的高度不大于当前位置的高度才符合条件)找最大宽度让这个宽度乘以高度就可以得到以当前位置的高度为高能做出的最大的矩形面积,所以我们遍历数组找出每个位置的最大矩形面积,它们中的最大值即为我们最后要求解的值

int largewide(int* heights, int heightsSize,int index)//找到以某一个位置的高度向两边延伸可以得到的矩形的最大面积
{
    int i=index-1,j=index+1;
    int length=1;
    while(i>=0&&heights[i]>=heights[index]&&j<heightsSize&&heights[j]>=heights[index])
    {
        i-=1;
        j+=1;
        length+=2;
    }
    while(i>=0&&heights[i]>=heights[index])
    {
        i-=1;
        length+=1;
    }
    while(j<heightsSize&&heights[j]>=heights[index])
    {
         j+=1;
        length+=1;
    }
    return heights[index]*length;
}
int largestRectangleArea(int* heights, int heightsSize){
      int i=0;
      int area=0,a=0;
      for(i=0;i<heightsSize;i++)
      {
        a=largewide(heights, heightsSize,i);
         if(a>area)
           area=a;
      }
     return area;
}

分治法
在这里插入图片描述以下方法来源于leetcode官方题解
在这里插入图片描述在这里插入图片描述在这里插入图片描述

int divide(int* heights,int low,int high)
{
    if(low>high)
      return 0;
    if(low==high)
    {
        return heights[low];
    }
    int min=heights[low];//存放最小高度
    int mini=low;//存放最小高度的下标
    int i=0;
    int area=0,a=0,b=0,max=heights[low];
    for(i=low;i<=high;i++)
    {
        if(heights[i]<min)
        {
            min=heights[i];
            mini=i;
        }    
        max=max>heights[i]?max:heights[i];
    }
    area=heights[mini]*(high-low+1);
     if(max==min)
        return area;
   
    if (low <= mini - 1) {
        int area1 = divide(heights, low, mini - 1);
        area = area > area1 ? area : area1;
    }
    
    if (mini + 1 <= high) {
        int area2 = divide(heights, mini + 1, high);
        area = area > area2 ? area : area2;
    }
    return area;
}
int largestRectangleArea(int* heights, int heightsSize){
    return divide( heights,0,heightsSize-1);
}

单调栈
在这里插入图片描述以下图片来源于leetcode官方提解
在这里插入图片描述说一点自己的理解吧 为什么这个栈中的元素一定要单调递增: 我们知道一旦一个矩形周围出现了一个比它更矮的矩形那等于说它的宽度就不能再扩展了 即它的面积不可能变的更大了 那就把它的宽度乘以高度求出面积,更新最大面积 并把它弹出栈

int divide(int* heights,int low,int high)
{
    if(low>high)
      return 0;
    if(low==high)
    {
        return heights[low];
    }
    int min=heights[low];//存放最小高度
    int mini=low;//存放最小高度的下标
    int i=0;
    int area=0,a=0,b=0,max=heights[low];
    for(i=low;i<=high;i++)
    {
        if(heights[i]<min)
        {
            min=heights[i];
            mini=i;
        }    
        max=max>heights[i]?max:heights[i];
    }
    area=heights[mini]*(high-low+1);
     if(max==min)
        return area;
   
    if (low <= mini - 1) {
        int area1 = divide(heights, low, mini - 1);
        area = area > area1 ? area : area1;
    }
    
    if (mini + 1 <= high) {
        int area2 = divide(heights, mini + 1, high);
        area = area > area2 ? area : area2;
    }
    return area;
}
int largestRectangleArea(int* heights, int heightsSize){
    return divide( heights,0,heightsSize-1);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!