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检测过程中突然想到的。
状态不好,晚上还得开周会,今天不做了。