题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思考
1、首先要定好上下左右的边界
2、以上下左右为维度依次进行遍历
3、一定要想好,每一轮行结束,行++;右边结束,右边–;以此类推
4、注意看结束条件,
5、第二段代码注释更明确,但是有bug
代码和注释
public class Solution {
public int[] spiralOrder(int[][] matrix) {
int row = matrix.length;
if (row == 0) {
return new int[0];
}
int col = matrix[0].length;
int[] res = new int[row * col];
int idx = 0;
int left = 0, top = 0, right = col - 1, bottom = row - 1;
while (true) {
//从左往右走
for (int i = left; i <= right; i++) {
res[idx++] = matrix[top][i];
}
if (++top > bottom) {
break;
}
//从上往下走
for (int i = top; i <= bottom; i++) {
res[idx++] = matrix[i][right];
}
if (--right < left) {
break;
}
//从右往左走
for (int i = right; i >= left; i--) {
res[idx++] = matrix[bottom][i];
}
if (--bottom < top) {
break;
}
//从下往上走
for (int i = bottom; i >= top; i--) {
res[idx++] = matrix[i][left];
}
if (++left > right) {
break;
}
}
return res;
}
}
// 第一次写有问题的代码,思路是对的,后期再过一遍
// 极端判断
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new int[0];
}
// 定义边界(左、右、上、下)
int l = 0, r = matrix.length - 1, t = 0, b = matrix[0].length - 1;
// 定义一个返回数组
int[] res = new int[(r+1) * (b+1)];
// 定义下标位置
int k = 0;
// 开始遍历
while(true){
// 从左到右
for(int i = t, j = l; j <= r; j++){
res[k++] = matrix[i][j];
}
// 从上到下第一行遍历完成,行++
t++;
// 调出循环
if(t > b){
break;
}
// 从上到下
for(int i = t, j = r; j <= b; i++){
res[k++] = matrix[i][j];
}
// 这时右边的遍历完成,r--
r--;
// 跳出循环
if(r < l){
break;
}
// 从右边到左
for(int i = b, j = r; j >= l; j--){
res[k++] = matrix[i][j];
}
b--;
if(b > t){
break;
}
// 从下到上
for(int i = b, j = l; i >= t; i--){
res[k++] = matrix[i][j];
}
// 这是左边的一行完了,l++
l++;
if(l > r){
break;
}
}
return res;
总结
1、分维度思考的算法思想
2、这里的维度就是上下左右
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96152.html