题目大意:
就是一个由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 };
思路三:二分
这个我也没有试,和暴力有点像,连续的1最大是N个,那么就找N/2长度的试,如果找到了就更长的,反正这样我猜复杂度应该是n2logn ?
有兴趣的试试吧