标签:count 面试题 顺时针 matrix record int 29 重合 ++
模拟+记录路径
思路
- 模拟矩阵打印的路径,同时用数组record记录当前元素是否被访问过
- 注意边界处理,否则易越界。
代码
/**
* 2ms O(mn)
* 空间复杂度 O(mn)
*/
public static int[] spiralOrder(int[][] matrix) {
if(matrix==null||matrix.length==0) return new int[0];
int r = matrix.length,count=0,c = matrix[0].length,sum=r*c;
int[] ans=new int[sum];
int[][] record= new int[r][c];
int i=0,j=0;
while(count<sum){
while(j<c&&record[i][j]==0){
ans[count]=matrix[i][j];
record[i][j]=1;
count++;
j++;
}
j--;
i++;
while(i<r&&record[i][j]==0){
ans[count]=matrix[i][j];
record[i][j]=1;
count++;
i++;
}
i--;
j--;
while(j>=0&&record[i][j]==0){
ans[count]=matrix[i][j];
record[i][j]=1;
count++;
j--;
}
j++;
i--;
while(i>=0&&record[i][j]==0){
ans[count]=matrix[i][j];
record[i][j]=1;
count++;
i--;
}
i++;
j++;
}
return ans;
}
优化
-
设置四个边界值,动态更新。空间复杂度O(mn)->O(1)
-
若有边界重合,则打印结束。
代码
/**
* 1ms O(mn)
* 空间复杂度 O(1)
*/
public static int[] spiralOrder2(int[][] matrix){
if(matrix.length == 0) return new int[0];
//定义 l r t b 四个边界
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
int[] res=new int[(r+1)*(b+1)];
while(true){//若有边界重合 打印结束
for(int i=1;i<=r;i++) res[x++]=matrix[t][i];//left->right
if(++t>b) break;//判断上下边界是否重合 未重合,则top->bottom
for(int i=1;i<=b;i++) res[x++]=matrix[i][r];//top->bottom
if(l>--r) break;//判断右左边界是否重合 未重合,则right->left
for(int i=r;i>=l;i--) res[x++]=matrix[b][i];//right->left
if(t>--b) break;//判断下上边界是否重合 未重合,则bottom->top
for(int i=b;i>=t;i--) res[x++]=matrix[i][l];//bottom->top
if(++l>r) break;//判断左右边界是否重合 未重合,则left->right
}
return res;
}
参考链接
标签:count,面试题,顺时针,matrix,record,int,29,重合,++ 来源: https://www.cnblogs.com/yh-simon/p/13054293.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。