剑指offer题解汇总 Java实现
https://blog.csdn.net/guliguliguliguli/article/details/126089434
本题链接
题目
思路 & 代码
-
用一个标记数组vis来标记已经访问过哪些元素
-
用变量cnt来记录访问过的数字的个数,也就是已经添加到arrayList中的数字的个数
-
假设矩阵的行数用变量row来记录,矩阵的列数用变量col来记录
-
用i,j在访问矩阵中的每个元素
-
i 和 j 初始化都为0
-
i 的范围是 [0,row-1]
-
j 的范围是[0,col-1]
-
-
可以把矩阵看成由外向内好多层,每遍历完一层,则需要完成四步:
-
从左到右,i 不变,j++
-
从上到下,j 不变,i++
-
从右到左,i 不变,j–
-
从下到上,j 不变,i–
-
-
循环结束的条件就是:所有的数字都已经访问过了
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int[][] matrix) {
//获取行数
int row = matrix.length;
//获取列数
int col = matrix[0].length;
//i用于纵向遍历
int i = 0;
//j用于横向遍历
int j = 0;
ArrayList<Integer> res = new ArrayList<>();
boolean[][] vis = new boolean[row][col];
int cnt = 0;
while (cnt != row * col) {
while (j < col && !vis[i][j] && cnt != row * col) {
vis[i][j] = true;
res.add(matrix[i][j++]);
cnt++;
}
j--;
i++;
while (i < row && !vis[i][j] && cnt != row * col) {
vis[i][j] = true;
res.add(matrix[i++][j]);
cnt++;
}
i--;
j--;
while (j >= 0 && !vis[i][j] && cnt != row * col) {
vis[i][j] = true;
res.add(matrix[i][j--]);
cnt++;
}
j++;
i--;
while (i >= 0 && !vis[i][j] && cnt != row * col) {
vis[i][j] = true;
res.add(matrix[i--][j]);
cnt++;
}
i++;
j++;
}
return res;
}
}