【剑指offer】29. 顺时针打印矩阵

93 阅读1分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 力扣
// 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

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

题解

// 牛客
// 运行时间:16ms
// 占用内存:9752k
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int row1 = 0;  // 行上边界
        int row2= matrix.length - 1;  // 行下边界
        int col1 = 0;  // 列左边界
        int col2 = matrix[0].length - 1;  // 列右边界
        ArrayList<Integer> res = new ArrayList<>();
        while (row1 <= row2 && col1 <= col2) {
			// 一个while循环遍历一圈
            res = printRes(matrix, row1, row2, col1, col2, res);
            row1++; row2--; col1++; col2--;  // 缩圈
        }
        return res;
    }
    
    private ArrayList<Integer> printRes(int[][] matrix, int row1, int row2, int col1, int col2, ArrayList<Integer> res) {
        // 上行
		for (int i = col1; i <= col2; i++) {
            res.add(matrix[row1][i]);
        }
		// 右列(右列要从row1+1位置开始,因为row1位置以前的元素在上行遍历过)
        for (int i = row1 + 1; i <= row2; i++) {
            res.add(matrix[i][col2]);
        }
		// 下行(下行要从col2-1开始,col2以前的位置被右列遍历过)
        if (row1 != row2) {
            for (int i = col2 - 1; i >= col1; i--)
                res.add(matrix[row2][i]);
        }
		// 左列(左列在空间位置上,row2以下和row1以上的位置都被遍历过)
        if (col1 != col2) {
            for (int i = row2 - 1; i > row1; i--) 
                res.add(matrix[i][col1]);
        }
        return res;
    }
}


// 力扣
// 力扣还需要考虑ArrayList到int[]的转换
// 执行用时:5 ms, 在所有 Java 提交中击败了9.34%的用户
// 内存消耗:39.5 MB, 在所有 Java 提交中击败了94.34%的用户
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }

        int row1 = 0;  // 行上边界
        int row2= matrix.length - 1;  // 行下边界
        int col1 = 0;  // 列左边界
        int col2 = matrix[0].length - 1;  // 列右边界
        ArrayList<Integer> res = new ArrayList<>();
        while (row1 <= row2 && col1 <= col2) {
            res = printRes(matrix, row1, row2, col1, col2, res);
            row1++; row2--; col1++; col2--;  // 缩圈
        }
        int[] result = toIntList(res);
        return result;
    }

    private ArrayList<Integer> printRes(int[][] matrix, int row1, int row2, int col1, int col2, ArrayList<Integer> res) {
		for (int i = col1; i <= col2; i++) {
            res.add(matrix[row1][i]);
        }
        for (int i = row1 + 1; i <= row2; i++) {
            res.add(matrix[i][col2]);
        }
        if (row1 != row2) {
            for (int i = col2 - 1; i >= col1; i--)
                res.add(matrix[row2][i]);
        }
        if (col1 != col2) {
            for (int i = row2 - 1; i > row1; i--) 
                res.add(matrix[i][col1]);
        }
        return res;
    }

    private int[] toIntList(ArrayList<Integer> res) {
        int[] result = new int[res.size()];
        for (int i = 0; i < res.size(); i++) {
            result[i] = res.get(i);
        }
        return result;
    }   
}