美文网首页
算法-29.顺时针打印矩阵

算法-29.顺时针打印矩阵

作者: zzq_nene | 来源:发表于2020-08-21 11:25 被阅读0次

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思路:与前面打印回环数组的算法类似。即定义方向,通过方向进行遍历,并且定义一个二维数组,用来将已经被遍历过的位置置为true,避免重复遍历

    public static int[] spiralOrder(int[][] matrix) {
        // 总的行数(二维数组第一个[]的长度)
        int m = matrix.length - 1;
        // 总的列数(二维数组第二个[]的长度)
        int n = matrix[0].length - 1;
        // 定义一个二维布尔数组,用来判断当前位置是否已经被遍历
        boolean[][] matrixs = new boolean[m+1][n+1];
        // 当前的行
        int curM = 0;
        // 当前的列
        int curN = 0;
        // 计算总元素个数
        int count = (n + 1) * (m +1);
        // 返回的元素一位数组
        int[] elements = new int[count];
        // 当前元素在一位数组中的索引
        int cur = 1;
        // 方向:0表示向右,1表示向下,2表示向左,3表示向上
        int direction = 0;
        // 初始化一位数组的第一个元素
        elements[0] = matrix[0][0];
        // 初始化二维布尔数组的第一个元素
        matrixs[0][0] = true;
        while (cur < count) {
            switch (direction%4) {
                case 0:
                    // 向右边
                    if (curN == n || matrixs[curM][curN+1]) {
                        curM++;
                        direction++;
                    } else {
                        curN++;
                    }
                    System.out.println("right");
                    break;
                case 1:
                    // 向下边
                    if (curM == m || matrixs[curM+1][curN]) {
                        curN--;
                        direction++;
                    } else {
                        curM++;
                    }
                    System.out.println("down");
                    break;
                case 2:
                    // 向左边
                    if (curN == 0 || matrixs[curM][curN-1]) {
                        curM--;
                        direction++;
                    } else {
                        curN--;
                    }
                    System.out.println("left");
                    break;
                case 3:
                    // 向上边
                    if (curM == 0 || matrixs[curM-1][curN]) {
                        curN++;
                        direction++;
                    } else {
                        curM--;
                    }
                    System.out.println("top");
                    break;
            }
            System.out.println("curM:" + curM + "   curN:" + curN);
            elements[cur] = matrix[curM][curN];
            matrixs[curM][curN] = true;
            cur++;
        }
        return elements;
    }

相关文章

网友评论

      本文标题:算法-29.顺时针打印矩阵

      本文链接:https://www.haomeiwen.com/subject/cdhidktx.html