leecode第五十四题(螺旋矩阵)

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        int len1=matrix.size();//如果是[[]]边界条件,len1=1,len2=0的,后面虽然边界没有反映,但是依然会返回空数组
        if(len1==0)
            return res;
        int len2=matrix[0].size();//但如果[]边界条件,len1=0,len2那句话就卡死了,所以这个len1==0的判断要放在求len2前面,错过
        
        if(len1==1 && len2==1)
        {
            res.push_back(matrix[0][0]);
            return res;
        }
        
        for(int i=0;i<((min(len1,len2)+1)/2);i++)//根据分析,每一个最外层显示完毕后,下一个是【i,i】为开头的内心的显示,没用递归,嫌麻烦,写成循环了
        {
            for(int j=i;j<(len2-i);j++)//第一行(从左到右)
                res.push_back(matrix[i][j]);
            
            if((len1-2*i)>1)//最后一列(从上到下),注意开头被第一行的尾巴显示过了
            {
                for(int j=i+1;j<(len1-i);j++)
                    res.push_back(matrix[j][len2-1-i]);
            }
            
            if((len2-2*i)>1 && (len1-2*i)>1)//最后一行(从右往左),注意开头被最后一列的尾巴显示过了
            {
                for(int j=(len2-2-i);j>=i;j--)
                    res.push_back(matrix[len1-1-i][j]);
            }
            
            if((len1-2*i-1)>1 && (len2-2*i)>1)//第一列(从下往上),注意开头和结尾都被别人显示过了
            {
                for(int j=(len1-2-i);j>i;j--)
                    res.push_back(matrix[j][i]);
            }
            //上述这些虽然看起来复杂,但是只要画图,思路清晰就能写出来
            //要注意每个判断、索引啥的,都得考虑i的值
            //要注意第一行不需要判断,因为一定存在,最后一列只要判断行数够不够即可
            //最后一行和第一列要判断行数、列数两个条件都够不够,错过
        }
        
        return res;
    }
};

分析:

如注释,错了两处,惭愧啊,这个还在剑指offer看过,第二个这种错误还能犯,注意力太不集中了,第一个倒是头疼了一下,cout检测过程中突然想到的。

状态不好,晚上还得开周会,今天不做了。

posted @ 2019-03-25 17:01  深夜十二点三十三  阅读(253)  评论(0编辑  收藏  举报