【算法】顺时针打印矩阵

顺时针打印矩阵

 

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字,例如,如果输入如下4*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。

解题思路

  1. 因为一个二维平面,给定两个坐标(x1, y1)和(x2, y2)可以唯一确定一个矩阵。
  2. 然后可以通过圈子来打印对应的矩阵,然后缩小圈子完成整个过程即可。

图解过程

这个时候就打印出了1,2,3,4,8,12,16,15,14,13,9,5。

然后这个时候缩小圈子继续重复:

这个时候继续打印出6,7,11,10。然后全部拼接起来就是答案了。

 

 

X代表纵行,纵坐标,         ,Y代表横行  切记

代码

 
import java.util.ArrayList;

/**
 * @author god-jiang
 * @date 2020/1/17  20:58
 */
public class Solution {
    static ArrayList<Integer> resList = new ArrayList<>();

    public static ArrayList<Integer> printMatrix(int[][] matrix) {
        //拿到左上角(x1, y1)和右下角(x2, y2)
        int x1 = 0;
        int y1 = 0;
        int x2 = matrix.length - 1;
        int y2 = matrix[0].length - 1;
        //顺时针打印圈子的数值
        while (x1 <= x2 && y1 <= y2) {
            helpPrintMatrix(matrix, x1++, y1++, x2--, y2--);
        }
        return resList;
    }

    public static void helpPrintMatrix(int[][] matrix, int x1, int y1, int x2, int y2) {
        if (x1 == x2) {
            for (int i = y1; i <= y2; i++) {
                resList.add(matrix[x1][i]);
            }
        } else if (y1 == y2) {
            for (int i = x1; i <= x2; i++) {
                resList.add(matrix[i][y1]);
            }
        //知道(x1, y1)和(x2, y2)可以确定一个矩阵
        } else {
            int curX = x1;
            int curY = y1;
            while (curY != y2) {
                resList.add(matrix[x1][curY]);
                curY++;
            }
            while (curX != x2) {
                resList.add(matrix[curX][y2]);
                curX++;
            }
            while (curY != y1) {
                resList.add(matrix[x2][curY]);
                curY--;
            }
            while (curX != x1) {
                resList.add(matrix[curX][y1]);
                curX--;
            }
        }
    }
}

 

posted @ 2021-05-28 17:51  abcdefghijklmnop  阅读(64)  评论(0编辑  收藏  举报