leetcode1139-最大的以1为边界的正方形

题目

题目如下图:

question

这道题目是上周末的周赛的一道题目,看到题目第一眼,其实我的思路是深度优先搜索,但是仔细想了下,还是决定先试试暴力的方式,主要是担心时间不够,额说到底还是自己的算法思路需要锻炼啊~

思路

那在这里我简单说下思路吧,首先选取数组长宽较小的一个作为阈值,说到底也是为了不要越界。然后就是一个简单的暴力循环,我们的目的是找到最大的正方形,那就先从 开始找。找到最大值后又从 开始找,如果发现一个零,就减小边长,在重新找,没找到一个值更新依次最大边长即可。思路比较简单,写的时候捋清楚思路!
ac代码如下:

代码

class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
    int ret=0;
    int  row=grid.size();
    int col=grid[0].size();
    int l= row>col? col:row;
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
           if(grid[i][j]==0) continue;
            int m=0;
            for(;m<l;m++){
                if(j+m>=col || i+m>=row) break;

                if(grid[i+m][j]==0 || grid[i][j+m]==0)
                    break;
            }
            m--;
            if((m+1)<ret) continue;
            for(int n=m;n>0;n--){

                if(grid[i+m][j+n]==0 || grid[i+n][j+m]==0) {
                  //  cout<<m<<" "<<i<<" "<<j<<" ";
                    n=m;
                     m--; //for的理解需要注意
                }       
            }
        //    cout<<m<<" "<<i<<" "<<j<<" ";
            ret=max(ret,m+1);

         }
    }
    return ret*ret;
}
};

这里我说一点:千万注意细节,我觉得我已经很多次出现这种情况了。 for循环中,或者++运算都是每次循环后执行的,我之前没注意到这点,把n=m;m–;调换了位置,一致ac不了,找了很久bug。
最后还是贴一张ac图吧。

anwser

一点感悟

好吧,到这里,还是有点东西想说下,上周六去了参观了华为武研所,感想的话就是除了天气太热了,其他都还不错,另外一个大家说的比较多的话题就是加班。讲道理,这个应该在任何互联网公司都是如此吧。虽然我还没有接触过,但是毕竟ddl在那里,只有硬着上了。这个话题还是以后再说吧。当时在经验分享的时候,一位师兄也说了,要找准自己的定位,你所付出的努力一定会和回报成正比的。说真的,当时听着也觉得很有道理,转念一想,其实是个很简单的道理,不要总是以为自己做的很多了,要是真的做了那么多为什么总是在遇到简单问题时需要那么多时间去解决呢。

还有就是,我觉得还是需要时不时地接受一些来自外界的激励的,有时候自我的鼓励也会导致自己麻木,多看看那些优秀的人还是可以一定程度上激发自己动力的。特别是在这种自己觉得无人可以倾诉的时候,但也不要过多感慨自己的不足,多努力一点就行。

现在想想,平时刷题的时候本来时间花的比较多,所以竞赛的时候才会觉得时间不够。一个离我最近的例子就是一道“akari”谜题年级上的大佬可以半天做出来,可是自己做了一天多才可以。差距真的大。那天看到班上大佬的akari谜题代码。真的服气,代码思路真的很清楚,条理清晰,希望自己多加训练也可以吧。还有就是我觉得多研读一些优秀的代码应该可以提升自己的吧。 行了下次写一下那道让我欲哭不能的akari吧。