1. 程式人生 > >Arithmetic problem | 找二維矩陣權值為1的最大矩形面積

Arithmetic problem | 找二維矩陣權值為1的最大矩形面積

題目如下:

給你一個二維矩陣,權值為FalseTrue,找到一個最大的矩形,使得裡面的值全部為True,輸出它的面積。

樣例

給你一個矩陣如下

[
  [1, 1, 0, 0, 1],
  [0, 1, 0, 0, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 0, 0, 1]
]

輸出6

解題思路:

沒接觸過這型別的題目一開始可能不知所措。遍歷方法不外乎一個個遍歷了,這類棋牌型的題目也沒什麼特別好的遍歷方法。但是,我們可以針對一特殊整體來求解。這思路重點就是把連續元素個數對映到某一行上,讓其獨立並求解。

從上面的矩陣可以看成下面這樣


然而,我們可以把每一行的連續元素都標誌上表示在該行上面有多少個連續元素。


到目前為止,我們將在某行上連續的元素個數對映到該行上,我們也就可以對其做獨立的面積求解了。此時只需要用短板橫切的方式即可求的所在行的最大矩形。


思路程式碼實現如下:

#define max(a,b) (a)>(b)?(a):(b)
void Method(vector<vector<bool>> &v)
{
    int h=v.size(),w=v[0].size(),i,j,l,r,u,m=0;
    int *t=new int[w+1];
    stack<int> s;
    memset(t,0,4*(w+1));
    for(i=0; i<h; ++i)
    {
        while(!s.empty())s.pop();
        for(j=0; j<=w; ++j)
        {
            t[j]=v[i][j]==0?0:t[j]+1;
        }
        for(j=0; j<=w; ++j)
        {
            while(!s.empty()&&t[s.top()]>t[j])
            {
                u=s.top(),s.pop();
                l=(s.empty()?u+1:u-s.top())*t[u];
                r=(j-u-1)*t[u];
                m=max(l+r,m);
            }
            s.push(j);
        }
    }
    delete[] t;
    printf("%d",m);
}