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

这篇博客主要介绍了如何使用Java实现顺时针打印矩阵的算法,包括问题描述、示例解析、思路分析及代码实现。算法通过设置一个二维布尔数组记录已访问的元素,利用两个指针按顺时针方向移动,并在遇到边界或已访问位置时调整方向。时间复杂度为O(nm),空间复杂度为O(nm)。
摘要由CSDN通过智能技术生成

剑指 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

思路

我们先设置一个和方向相关的二维数组dir,然后从(0,0)下标开始遍历数组,输出所有到达的数字。在遍历的过程中,如果碰到边界或者已经走过的地方,就改变前进的方向,等走完所有的地方,就直接结束循环

时间复杂度:O(nm)

空间复杂度:O(nm)

代码

import java.util.ArrayList;
​
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) return new int[0];
        List<Integer> list = new ArrayList();
        boolean map[][] = new boolean[100][100];
​
        int n = matrix.length;
        int m = matrix[0].length;
​
        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                map[i][j] = true;
            }
        }
​
        int l[] = new int[]{0, 1, 0, -1};
        int r[] = new int[]{1, 0, -1, 0};
        int x = 0, y = 0, num = 0, ans = 1;
​
        list.add(matrix[0][0]);
        map[0][0] = false;
​
        while(ans < n * m){
            boolean flag = true;
            if (x + l[num] < n && x + l[num] >= 0){
                if (y + r[num] < m && y + r[num] >= 0){
                    if (map[x + l[num]][y + r[num]]){
                        x += l[num];
                        y += r[num];
                        list.add(matrix[x][y]);
                        map[x][y] = false;
                        ans++;
                    }else{
                        flag = false;
                    }
                }else{
                    flag = false;
                }
            }else{
                flag = false;
            }
​
            if (!flag){
                num++;
                num %= 4;
            }
        }
        int[] k = new int[list.size()];
        for (int i = 0; i < list.size(); i++){
            k[i] = list.get(i);
        }
        return k;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值