leetcode54 & 剑指 Offer 29. 顺时针打印矩阵


力扣链接

题目描述

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

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制:

  • 0 <= matrix.length <= 100
  • 0 <= matrix[i].length <= 100

解题思路

循环遍历当步数<m*n时,由于每一个方向遍历的步数都是有规律的,只要遍历到步数为零停止即可,最后返回遍历的所有元素

代码

class Solution {
    
    
    public int[] spiralOrder(int[][] matrix) {
    
    
        int m = matrix.length;
        if (m == 0) {
    
    
            return new int[0];
        }
        int n = matrix[0].length;
        if (n == 0) {
    
    
            return new int[0];
        }
        List<Integer> list = new ArrayList<>();
        //元素的个数
        int count = m * n;
        //轮数
        int k = 0;
        int i = 0;
        int j = 0;
        while (count > 0) {
    
    
            for (; j < n - k && count > 0; j++) {
    
    
                list.add(matrix[i][j]);
                count--;
            }
            j--;
            i++;
            
            for (; i < m - k && count > 0; i++) {
    
    
                list.add(matrix[i][j]);
                count--;
            }
            i--;
            j--;
            
            for (; j >= k && count > 0; j--) {
    
    
                list.add(matrix[i][j]);
                count--;
            }
            j++;
            i--;
            
            for (; i >= k + 1 && count > 0; i--) {
    
    
                list.add(matrix[i][j]);
                count--;
            }
            i++;
            j++;
            k++;
            
        }
        int[] res = new int[list.size()];
        int index = 0;
        for (Integer integer : list) {
    
    
            res[index++] = integer;
        }
        return res;
    }
}

时间复杂度

O(m*n)

猜你喜欢

转载自blog.csdn.net/qq_43478625/article/details/121302356