我是靠谱客的博主 仁爱镜子,最近开发中收集的这篇文章主要介绍[剑指 Offer 29]顺时针打印矩阵[剑指 Offer 29]顺时针打印矩阵,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

题解

  • new一个结果数组,长度为 matrix 元素个数
  • 控制边界,将 matrix 元素赋值给 结果数组
  • 顺时针打印,控制边界条件如下:
    • 从左到右:列在变,横坐标始终为t,本行完成后上边界向下收缩
    • 从上到下:行在变,纵坐标始终为r,本列完成后右边界向左收缩
    • 从右到左:列在变,横坐标始终为b,本行完成后下边界向上收缩
    • 从右到左:行在变,纵坐标始终为l,本行完成后左边界向右收缩
class Solution {
    public int[] spiralOrder(int[][] matrix) {

        int length = matrix.length * matrix[0].length;
        int[] res = new int[length];
        int index = 0;

        int l = 0, r = matrix[0].length-1, t = 0, b = matrix.length-1;

        while (true){
            //从左到右,列在变,横坐标始终为t,本行完成后上边界向下收缩
            for(int i = l; i <= r; i++) res[index++] = matrix[t][i];
            if(++t > b) break;

            //从上到下,行在变,纵坐标始终为r,本列完成后右边界向左收缩
            for(int i = t; i <= b; i++) res[index++] = matrix[i][r];
            if(l > --r) break;

            //从右到左,列在变,横坐标始终为b,本行完成后下边界向上收缩
            for(int i = r; i >= l; i--) res[index++] = matrix[b][i];
            if(t > --b) break;

            //从右到左,行在变,纵坐标始终为l,本行完成后左边界向右收缩
            for(int i = b; i >= t; i--) res[index++] = matrix[i][l];
            if(++l > r) break;

        }

        return res;
    }
}

顺时针打印矩阵顺时针打印矩阵

最后

以上就是仁爱镜子为你收集整理的[剑指 Offer 29]顺时针打印矩阵[剑指 Offer 29]顺时针打印矩阵的全部内容,希望文章能够帮你解决[剑指 Offer 29]顺时针打印矩阵[剑指 Offer 29]顺时针打印矩阵所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部