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

导读:本篇文章讲解 剑指 Offer 29. 顺时针打印矩阵,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com



题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
在这里插入图片描述

思考

1、首先要定好上下左右的边界
2、以上下左右为维度依次进行遍历
3、一定要想好,每一轮行结束,行++;右边结束,右边–;以此类推
4、注意看结束条件,
5、第二段代码注释更明确,但是有bug

代码和注释

public 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;
    }
}

// 第一次写有问题的代码,思路是对的,后期再过一遍

 // 极端判断
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return new int[0];
        }
        // 定义边界(左、右、上、下)
        int l = 0, r = matrix.length - 1, t = 0, b = matrix[0].length - 1;
        // 定义一个返回数组
        int[] res = new int[(r+1) * (b+1)];
        // 定义下标位置
        int k = 0;
        // 开始遍历
        while(true){
            // 从左到右
            for(int i = t, j = l; j <= r; j++){
                res[k++] = matrix[i][j];
            }
            // 从上到下第一行遍历完成,行++
            t++;
            // 调出循环
            if(t > b){
                break;
            }
            // 从上到下
            for(int i = t, j = r; j <= b; i++){
               res[k++] = matrix[i][j];
            } 
            // 这时右边的遍历完成,r--
            r--;
            // 跳出循环
            if(r < l){
                break;
            }
            // 从右边到左
            for(int i = b, j = r; j >= l; j--){
                res[k++] = matrix[i][j];
            }
            b--;
            if(b > t){
                break;
            }

            // 从下到上
            for(int i = b, j = l; i >= t; i--){
                res[k++] = matrix[i][j];
            }
            // 这是左边的一行完了,l++
            l++;
            if(l > r){
                break;
            }
        }
        return res;

总结

1、分维度思考的算法思想
2、这里的维度就是上下左右

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96152.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!