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);
    }
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值