764. Largest Plus Sign

题目大意:

    就是一个由1和0组成的正方形矩阵,求里面最大的加号的大小,这个大小就是长度。

    

什么鬼啊,本来想自己想的,结果看了半天没看懂具体什么意思,然后查了下题解,希望有人说一下意思,结果一上来就是思路,还直接动态规划四个大字,我也是呵呵了

思路一:暴力Brute Force

    就是用i, j 循环每一个位置,判断该位置的上下左右的最长“1序列”,复杂度大概是n3

    ***这个据说过不了

 

思路二:动态规划Dynamic Programming

    说实话看完源码才想到的,感觉挺好的,直接看源码大把,很好理解,反正大概就是正向扫一遍,连续的1递增,比如0111011就是0123012,然后反向再扫一遍就是,取最小值。0121011

    然后从上到下扫一遍,再从下到上扫一遍,同样取最小值

    

 1 class Solution {
 2 public:
 3     int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
 4         int map[505][505];
 5         memset(map,0,sizeof(map));
 6         for(int i=0;i<mines.size();i++)
 7         {
 8             map[mines[i][0]][mines[i][1]] = 1;
 9         }
10         int dp[505][505];
11         memset(dp,0,sizeof(dp));
12         for(int i=0;i<N;i++) {
13             int count = 0;
14             for(int j=0;j<N;j++) {
15                 count = map[i][j]==0?++count:0;
16                 dp[i][j] = count;
17             }
18             
19             count = 0;
20             for(int j=N-1;j>=0;j--) {
21                 count = map[i][j]==0?++count:0;
22                 dp[i][j] = min(count, dp[i][j]);
23             }
24         }
25 
26         for(int i=0;i<N;i++) {
27             int count = 0;
28             for(int j=0;j<N;j++) {
29                 count = map[j][i]==0?++count:0;
30                 dp[j][i] = min(count, dp[i][j]);
31             }
32             
33             count = 0;
34             for(int j=N-1;j>=0;j--) {
35                 count = map[j][i]==0?++count:0;
36                 dp[j][i] = min(count, dp[i][j]);
37             }
38         }
39         int ans = 0;
40         for(int i=0;i<N;i++) {
41             for(int j=0;j<N;j++) {
42                 ans = max(ans, dp[i][j]);
43             }
44         }
45     }
46 };
View Code

思路三:二分

    这个我也没有试,和暴力有点像,连续的1最大是N个,那么就找N/2长度的试,如果找到了就更长的,反正这样我猜复杂度应该是n2logn ?

    有兴趣的试试吧

posted @ 2018-01-17 21:58  swallowblank  阅读(375)  评论(0编辑  收藏  举报