Java~顺时针打印N*N矩阵和顺时针打印N*M矩阵
文章目录
顺时针打印N*N矩阵
-
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. -
思路
对于N * N矩阵, 我们会发现, 其每一次打印都是一圈上下左右都打印, 那我们可以利用这个特性, 递归遍历其每一圈的第一行, 最右边列, 最下边行, 最左边列
因为其是N*N的, 所以矩阵的宽和高高一样的, 那我们使用俩个临时变量, 一个start表示起始地方, 一个end表示结束地方, 对于第一行, 遍历挨个遍历起始行就行, 对于最右边列, 挨个遍历每一行的结束位置, 对于最下边一行, 挨个遍历结束行的数据, 对于最左边行, 挨个遍历每一行的起始位置即可
最后将起始位置加一, 结束位置减一即可遍历其内部一圈一圈的数据 -
代码
public ArrayList<Integer> printMatrix2(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if (matrix == null) {
return list;
}
add(matrix, 0, matrix[0].length - 1, list);
return list;
}
private void add(int[][] matrix, int start, int end, ArrayList<Integer> list) {
if (start > end || end < 0) {
return;
}
for (int i = start; i <= end; i++) {
list.add(matrix[start][i]);
}
for (int i = start + 1; i <= end; i++) {
list.add(matrix[i][end]);
}
for (int i = end - 1; i >= start; i--) {
list.add(matrix[end][i]);
}
for (int i = end - 1; i > start; i--) {
list.add(matrix[i][start]);
}
add(matrix, start + 1, end - 1, list);
}
顺时针打印N*M矩阵
-
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下3 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 则依次打印出数字[1, 2, 3, 4, 5, 10, 15, 14, 13, 12, 11, 6, 7, 8, 9]
https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1 -
思路
这个对于上述变化还是很大的,因为这个就不能保证每次递归的时候都是完整的一圈的数据, 比如传入的矩阵数据就一行, 或者一列, 那么使用上述的办法就会出现行或者列的2次打印
所以解决这个需要三个临时变量, 一个标识起始位置, 一个表示矩阵的深度, 一个表示矩阵的宽度(也就是结束位置)
对于起始行遍历不变, 对最右边列的遍历注意要使用矩阵的深度, 对于最小边行的遍历还需要加一个条件就是dep > start 表示矩阵的深度要大于起始行才可以遍历, 这样就防止了这一圈数据只有一行的情况
, 对于遍历最左列的数据也要加一个条件, with > start 表示矩阵的宽度要大于初始列, 这样也就防止了出现矩阵只有一列数据的时候 -
代码
import java.util.*;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if (matrix == null) {
return list;
}
printf(matrix, 0, matrix.length - 1, matrix[0].length - 1, list);
return list;
}
private void printf(int[][] matrix, int start, int dep, int with, ArrayList<Integer> list) {
if (start > with || start > dep || dep < 0 || with < 0) {
return;
}
for (int i = start; i <= with; i++) {
list.add(matrix[start][i]);
}
for (int i = start + 1; i <= dep; i++) {
list.add(matrix[i][with]);
}
for (int i = with - 1; i >= start && dep > start; i--) {
list.add(matrix[dep][i]);
}
for (int i = dep - 1; i > start && with > start; i--) {
list.add(matrix[i][start]);
}
printf(matrix, start + 1, dep - 1, with - 1, list);
}
}
本文地址:https://blog.csdn.net/Shangxingya/article/details/110875906
上一篇: 查询支付宝电话号中隐藏的六位数
下一篇: 超级详细之Linux配置java环境变量