题目大意:
螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=54
解题思路分析:
想要顺时针螺旋输出矩阵内所有元素,移动顺序应该是从坐标[0, 0]开始按照右下左上的顺序转动,关键在于判断转弯处,我们定义4个变量t,b,l,r来代表上下左右4个边界,初始时4个边界分别为矩阵边界。再定义一个数组dir[],{0,1}代表向右移动,{0,-1}代表向左移动, {1,0} 是向下移动,{-1,0}则是向上移动。初始时,移动方向为右,即{0,1}。
移动到当前点时,先将当前点加入返回结果,然后根据当前方向得出下一点的坐标,当:
- 当前移动方向为右,并且当前右侧点超出右边界r时,方向转为向下。上边t界加一
- 当前移动方向为下,并且当前下侧点超出下边界b时,方向转为向左。右边r界减一
- 当前移动方向为左,并且当前左侧点超出左边界l时,方向转为向上。下边b界减一
- 当前移动方向为上,并且当前上侧点超出上边界t时,方向转为向右。左边l界加一
- 上述以外情况,继续沿当前方向移动
实现代码:
public List<Integer> spiralOrder(int[][] matrix) {
// 返回结果
List<Integer> res = new ArrayList<>();
// 如果矩阵为空,返回空
if(matrix.length==0) return res;
// 矩阵总元素数
int count=matrix.length*matrix[0].length;
// 定义四个边界,初始时为矩阵边界
int l=0,r=matrix[0].length-1,t=0,b=matrix.length-1;
// 当前点坐标
int row=0, col=0;
// 初始移动方向为向右移动
int[] dir={0,1};
// 当返回结果个数小于元素个数时循环
while(res.size()<count){
// 将当前点加入返回结果
res.add(matrix[row][col]);
// 当前移动方向为右,并且当前右侧点超出右边界r时
if(dir[1]==1&&col+1>r){
// 方向转为向下。上边界加一
dir[0]=1;
dir[1]=0;
t++;
}
// 当前移动方向为下,并且当前下侧点超出下边界b时
else if(dir[0]==1&&row+1>b){
// 方向转为向左。右边界减一
dir[0]=0;
dir[1]=-1;
r--;
}
// 当前移动方向为左,并且当前左侧点超出左边界l时
else if(dir[1]==-1&&col-1<l){
// 方向转为向上。下边界减一
dir[0]=-1;
dir[1]=0;
b--;
}
// 当前移动方向为上,并且当前上侧点超出上边界t时
else if(dir[0]==-1&&row-1<t){
// 方向转为向右。左边界加一
dir[0]=0;
dir[1]=1;
l++;
}
// 下一个点坐标
row+=dir[0];
col+=dir[1];
}
return res;
} 本题解法执行时间为0ms。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Spiral Matrix.
Memory Usage: 40.9 MB, less than 5.21% of Java online submissions for Spiral Matrix.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-54-spiral-matrix-解题思路分析/