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


    1. 题目

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

    2. 示例

    示例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

    3. 题解

    其实这题相当于一个规律题,如何控制它先往右打印,接着往下打印,然后往左打印,最后往上打印。

    首先,想到的是外面嵌套一个for循环,然后在里面判断,这种方式对于边界不好控制。

    接着,定义四个边界,然后来控制,可行:

    • 左边界:left = 0;
    • 上边界: top = 0;
    • 右边界:right = col - 1;
    • 下边界:bottom = row - 1;

    然后一直循环查找:

    • 首先从左往右,i从left开始,结束条件是right,i++;结束之后,因为之后就是往下找,如果下边已经找过就结束,判断条件是:++top > bottom;
    • 接着从上往下,i从top开始,结束条件是bottom,i++;结束之后,因为之后是往左找,如果左边已经找过就结束,判断条件是:--right < left;
    • 然后从左往右,i从right开始,结束条件是left,i++;结束之后,因为之后是往上找,如果上边已经找过就结束,判断条件是--bottom < top;
    • 最后从下往上,i从bottom开始,结束条件是top,i++;结束之后,因为之后是重新开始循环,往右找,如果右边已经找过就结束,判断条件是left++< right;
    • 上边一直循环,直到某个判断条件不满足,就结束。

    4. 实现

    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            
           int row = matrix.length;
           if(row == 0) return new int[0];
           int col = matrix[0].length;
           // 定义一维数组
           int[] res = new int[row * col];
           // 定义索引
           int idx = 0;
           int left = 0, top = 0, right = col - 1, bottom = row - 1;
           while(true) {
               // 从左往右
               for(int i = left; i <= right; i++) {
                   res[idx++] = matrix[top][i];
               }
               if(++top > bottom) break;
               // 从上往下
               for(int i = top; i <= bottom; i++) {
                   res[idx++] = matrix[i][right];
               }
               if(--right < left) break;
               // 从右往左
               for(int i = right; i >= left; i--) {
                   res[idx++] = matrix[bottom][i];
               }
               if(--bottom < top) break;
               // 从下往上
               for(int i = bottom; i >= top; i--) {
                   res[idx++] = matrix[i][left];
               }
               if(++left > right) break;
           }
    
            return res;
        }
    }

    5. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

    但行好事 莫问前程
  • 相关阅读:
    基于pandas索引的数据查找、排序和去重小结
    python中的变量引用小结
    python中日志logging模块和异常捕获traceback模块的使用
    undefined和not defined
    spring 整合dubbo session中调用用户转换异常 classcastEcxeption
    iframe占满整个屏幕
    freemarker获取url中参数
    H5的新增标签
    Redis
    类加载过程
  • 原文地址:https://www.cnblogs.com/haifwu/p/14979882.html
Copyright © 2020-2023  润新知