leetcode算法題--最大正方形

原題鏈接:https://leetcode-cn.com/problems/maximal-square/
動態規劃轉移式:

 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;

代碼:

int maximalSquare(vector<vector<char>>& matrix) {
    if(matrix.empty()) return 0;
    int m=matrix.size();
    int n=matrix[0].size();
    int S=0;
    vector<vector<int>> dp(m,vector(n,0));
    for(int i=0;i<m;i++){
        if(matrix[i][0]=='1') S=1;
        dp[i][0]=matrix[i][0]-'0';
    } 
    for(int j=0;j<n;j++) {
        if(matrix[0][j]=='1') S=1;
        dp[0][j]=matrix[0][j]-'0';
    }
    for(int i=1;i<m;i++){
        for(int j=1;j<n;j++){
            if(matrix[i-1][j-1]=='1'&&matrix[i-1][j]=='1'&&matrix[i][j-1]=='1'&&matrix[i][j]=='1'){
                dp[i][j]=2;
            } 
            if(dp[i-1][j-1]&&dp[i-1][j]&&dp[i][j-1]&&matrix[i][j]=='1'){
                dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
            }
            S=std::max(S,matrix[i][j]-'0');
            S=std::max(S,dp[i][j]*dp[i][j]);
        }
    }
    return S;
}

但是這個代碼還能再優化,比如dp數組的初始化,這裏可以將數組兩維都分別多設置一行,這樣可以省去初始化代碼了。很機智!並且我之前的代碼有點混亂,其實有了min這個約束,判斷條件只用判斷maxtrix[i][j]=='1’即可,並且計算dp的代碼也可以簡化。

int maximalSquare(vector<vector<char>>& matrix) {
    if(matrix.empty()) return 0;
    int m=matrix.size();
    int n=matrix[0].size();
    int S=0;
    vector<vector<int>> dp(m+1,vector(n+1,0));
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(matrix[i-1][j-1]=='1'){
                dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
            }
            S=max(S,dp[i][j]*dp[i][j]);
        }
    }
    return S;
}

好的思路永遠是最重要的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章