【剑指offer】顺时针打印矩阵 --Java实现

顺时针打印矩阵

https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion

【剑指offer】顺时针打印矩阵 --Java实现

题解

1. 分析

刷 LeetCode 看到的大神题解,感觉容易理解且好写
简单来说,就是不断地收缩矩阵的边界
定义四个变量代表范围,up、down、left、right

  1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错

2. 代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return list;
        }
        int up = 0;
        int down = matrix.length-1;
        int left = 0;
        int right = matrix[0].length-1;
        while(true){
            // 最上面一行
            for(int col=left;col<=right;col++){
                list.add(matrix[up][col]);
            }
            // 向下逼近
            up++;
            // 判断是否越界
            if(up > down){
                break;
            }
            // 最右边一行
            for(int row=up;row<=down;row++){
                list.add(matrix[row][right]);
            }
            // 向左逼近
            right--;
            // 判断是否越界
            if(left > right){
                break;
            }
            // 最下面一行
            for(int col=right;col>=left;col--){
                list.add(matrix[down][col]);
            }
            // 向上逼近
            down--;
            // 判断是否越界
            if(up > down){
                break;
            }
            // 最左边一行
            for(int row=down;row>=up;row--){
                list.add(matrix[row][left]);
            }
            // 向右逼近
            left++;
            // 判断是否越界
            if(left > right){
                break;
            }
        }
        return list;
    }
}

3. 复杂度

时间复杂度:
空间复杂度:

全部评论
目测空间复杂度为 n
6 回复 分享
发布于 2020-01-22 17:19
大佬时间复杂度怎么算的我怎么感觉是n^2
2 回复 分享
发布于 2020-02-04 03:35
注释改了一点错误 import java.util.ArrayList; public class Solution {     public ArrayList<Integer> printMatrix(int [][] matrix) {         ArrayList<Integer> list = new ArrayList<>();         if(matrix == null || matrix.length == 0 || matrix[0].length == 0){             return list;         }         int up = 0;         int down = matrix.length-1;         int left = 0;         int right = matrix[0].length-1;         while(true){             // 最上面一行             for(int col=left;col<=right;col++){                 list.add(matrix[up][col]);             }             // 向下逼近             up++;             // 判断是否越界             if(up > down){                 break;             }             // 最右边一列             for(int row=up;row<=down;row++){                 list.add(matrix[row][right]);             }             // 向左逼近             right--;             // 判断是否越界             if(left > right){                 break;             }             // 最下面一行             for(int col=right;col>=left;col--){                 list.add(matrix[down][col]);             }             // 向上逼近             down--;             // 判断是否越界             if(up > down){                 break;             }             // 最左边一列             for(int row=down;row>=up;row--){                 list.add(matrix[row][left]);             }             // 向右逼近             left++;             // 判断是否越界             if(left > right){                 break;             }         }         return list;     } }
2 回复 分享
发布于 2020-01-07 15:01
通俗易懂
1 回复 分享
发布于 2021-05-16 15:00
俺也一样!
1 回复 分享
发布于 2020-05-23 15:29
时间复杂度n?是n<sup>2</sup>
1 回复 分享
发布于 2020-02-26 11:32
好像有点问题? 出现一条竖线的时候 判断会失效
点赞 回复 分享
发布于 2022-02-25 16:16
nb!
点赞 回复 分享
发布于 2021-09-24 17:30
请问这里的时间复杂度为什么不是O(MN):其中 m 和 n 分别是输入矩阵的行数和列数。
点赞 回复 分享
发布于 2021-09-04 10:03
通俗易懂
点赞 回复 分享
发布于 2021-08-24 11:22
思路清晰
点赞 回复 分享
发布于 2021-03-30 12:47
厉害厉害!
点赞 回复 分享
发布于 2021-03-28 18:45
nb,思路清晰,代码简单
点赞 回复 分享
发布于 2021-03-27 16:09
很赞
点赞 回复 分享
发布于 2020-09-20 17:23
很好的思路,官方题解也不错
点赞 回复 分享
发布于 2020-09-08 14:03
点赞 回复 分享
发布于 2020-08-31 20:17
Solution.java:16: error: break outside switch or loop break;为什么出现break 错误
点赞 回复 分享
发布于 2020-08-26 16:56
我TM直呼内行
点赞 回复 分享
发布于 2020-08-23 18:03
牛逼
点赞 回复 分享
发布于 2020-07-16 19:19
大神就是不一样啊
点赞 回复 分享
发布于 2020-05-14 01:21

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
评论
281
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务