leetcode 764.Largest Plus Sign

根据题意的话就是在非0的地方开始寻找上下左右分别能够走到的最大步长的。

那么使用暴力的方法竟然leetcode还是给过了。

class Solution {
public:
    int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
        int res=0;
        vector<vector<int>> vis(N, vector<int>(N,1));
        for(int i=0;i<mines.size();i++){
            vis[mines[i][0]][mines[i][1]]=0;
        }
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(vis[i][j]){
                    int step=1;
                    while(judge(vis,N,i,j,step)) step++;
                    res=max(res,step);
                }
            }
        }
        return res;
    }
    bool judge(vector<vector<int>>&vis,int N, int i,int j, int step){
        if(i-step<0||i+step>=N||j-step<0||j+step>=N) return false;
        return vis[i-step][j] &&vis[i+step][j]&&vis[i][j-step]&&vis[i][j+step];
    }
};

在这里会发现存在大量的计算冗余的,考虑使用dp的动态规划,利用dp[i][j]来标记在方向上能够移动的最长距离的。

简化算法参考:http://www.cnblogs.com/grandyang/p/8679286.html

向左移动: [i][j]: j在内层循环,从小到大;

向右移动: [i][j]: j在内层循环,从大到小;

向下移动: [i][j]: i在内层循环,从小到大;

向上移动: [i][j]: i在内层循环,从大到小;

class Solution {
public:
    int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
        int res=0;
        vector<vector<int>> dp(N, vector<int>(N,N));
        for(int i=0;i<mines.size();i++){
            dp[mines[i][0]][mines[i][1]]=0;
        }
        for(int i=0;i<N;i++){
            int l=0,r=0,u=0,d=0;
            for(int j=0,k=N-1; j<N,k>=0; j++,k--){
                dp[i][j]=min(dp[i][j], l=(dp[i][j]==0)?0:l+1); // left方向
                dp[i][k]=min(dp[i][k], r=(dp[i][k]==0)?0:r+1); // right方向
                dp[j][i]=min(dp[j][i], d=(dp[j][i]==0)?0:d+1); // down方向
                dp[k][i]=min(dp[k][i], u=(dp[k][i]==0)?0:u+1); // up方向
            }
        }
        for(int i=0;i<N*N;i++) res=max(res, dp[i/N][i%N]);
        return res;
    }
};

 

posted on 2018-09-12 15:59  昔风不止,唯有努力生存  阅读(109)  评论(0编辑  收藏  举报

导航