转圈打印矩阵

转圈打印矩阵

【题目】

给定一个整型矩阵 matrix,请按照转圈的方式打印它。 例如:

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

【要求】

额外空间复杂度为 O(1)。

思路:

本题在算法上没有难度,关键在于设计一种逻辑容易理解、代码易于实现的转圈遍历方式。 这里介绍这样一种矩阵处理方式,该方式不仅可用于这道题,还适合很多其他的面试题,就是 矩阵分圈处理。在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵, 比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下:

1 2 3 4

5 8 9 12

13 14 15 16

如果能把这个子矩阵的外层转圈打印出来,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)时,打印的结 果为:1,2,3,4,8,12,16,15,14,13,9,5。接下来令 tR 和 tC 加 1,即(tR,tC)=(1,1), 令 dR 和 dC 减 1,即(dR,dC)=(2,2),此时表示的子矩阵如下:

6 7

10 11

再把这个子矩阵转圈打印出来,结果为:6,7,11,10。把 tR 和 tC 加 1,即(tR,tC)=(2,2), 令 dR 和 dC 减 1,即(dR,dC)=(1,1)。如果发现左上角坐标跑到了右下角坐标的右方或下方,整个 过程就停止。已经打印的所有结果连起来就是我们要求的打印结果。具体请参看如下代码中的 spiralOrderPrint 方法,其中 printEdge 方法是转圈打印一个子矩阵的外层。

java 复制代码
public class Solution {
    int length=0;
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length==0)
        {
            return new int[0];
        }
        int tR=0;
        int tC=0;
        int dR= matrix.length-1;
        int dC=matrix[0].length-1;
        int[] arr=new int[matrix.length*matrix[0].length];
        while(tR<=dR && tC<=dC)
        {
            printMatric(matrix,arr,tR++,tC++,dR--,dC--);
        }
        return arr;
    }

    private void printMatric(int[][] matrix, int[] arr, int tR, int tC, int dR, int dC) {
        if(tR==dR)
        {
            while (tC<=dC)
            {
                arr[length++]=matrix[tR][tC++];
            }

        }
        else if(tC==dC)
        {
            while(tR<=dR)
            {
                arr[length++]=matrix[tR++][tC];
            }
        }
        else {
            int curc=tC;
            int curR=tR;
            while (curc<dC)
            {
                arr[length++]=matrix[tR][curc++];
            }

            while(curR<dR)
            {
                arr[length++]=matrix[curR++][curc];
            }

            while (curc>tC)
            {
                arr[length++]=matrix[dR][curc--];
            }

            while(curR>tR)
            {
                arr[length++]=matrix[curR--][tC];
            }

        }

    }

}
相关推荐
CoderYanger9 小时前
C.滑动窗口-求子数组个数-越短越合法——3258. 统计满足 K 约束的子字符串数量 I
java·开发语言·算法·leetcode·1024程序员节
2301_807997389 小时前
代码随想录-day56
算法
AI科技星9 小时前
时空运动的几何约束:张祥前统一场论中圆柱螺旋运动光速不变性的严格数学证明与物理诠释
服务器·数据结构·人工智能·python·科技·算法·生活
杰克尼9 小时前
蓝桥云课-13. 定时任务
java·开发语言·算法
一个不知名程序员www9 小时前
算法学习入门---list与算法竞赛中的链表题(C++)
c++·算法
CoderYanger9 小时前
动态规划算法-路径问题:9.最小路径和
开发语言·算法·leetcode·动态规划·1024程序员节
老欧学视觉9 小时前
0012机器学习KNN算法
人工智能·算法·机器学习
月明长歌9 小时前
【码道初阶】一道经典的简单题:Boyer-Moore 多数投票算法|多数元素问题(LeetCode 169)
算法·leetcode·职场和发展
CoderYanger9 小时前
动态规划算法-路径问题:7.礼物的最大价值
开发语言·算法·leetcode·动态规划·1024程序员节
蕓晨9 小时前
钱币找零问题-贪心算法解析
c++·算法·贪心算法