资讯专栏INFORMATION COLUMN

【剑指offer】顺时针打印矩阵

Hujiawei / 3198人阅读

摘要:题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵则依次打印出数字题解这个题目就是正常的模拟就好。此外还要注意判断一下矩阵是的情况。

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.

题解

这个题目就是正常的模拟就好。
定义四个变量。
top: 表示最上面的行;
bottom:表示最小面的行;
left:表示最左边的列;
right: 表示最右边的列;

左 -> 右,这个时候相当于最上面这一行就打印完了,这个时候最上面的行top要++;

右 -> 下,这个时候相当于最右边这一列就打印完了,这个时候最右边的列right要--;

右 -> 左,这个时候相当于最下边这一行就打印完了,这个时候最下边的行bottom要--;

下 -> 上,这个时候相当于最左边这一列就打印完了,这个时候最左边的列left要--;

但是每一步完成之后可能都会遇到边界条件:

1 2 3 4

比如上面这个case,top++之后就应该跳出循环,不应该继续走了。

1
2
3
4

再比如上面这个case,走到right--之后就应该跳出循环,不应该继续走了。

此外还要注意判断一下矩阵是null的情况。

import java.util.ArrayList;
public class Solution {
    public ArrayList printMatrix(int [][] matrix) {
       if (matrix == null) return new ArrayList();
       int top = 0;
       int bottom = matrix.length - 1;
       int left = 0;
       int right = matrix[0].length - 1;
       ArrayList result = new ArrayList();
       while (top <= bottom && left <= right) {
           for (int i = left; i <= right; i++) {
               result.add(matrix[top][i]);
           }
           top++;
           if (top > bottom) {
               break;
           }
           for (int i = top; i <= bottom; i++) {
               result.add(matrix[i][right]);
           }
           right--;
           if (left > right) {
               break;
           }
           
          for (int i = right; i >= left; i--) {
              result.add(matrix[bottom][i]);
          }
           bottom--;
           if (top > bottom) {
               break;
           }
           
           for (int i = bottom; i >= top; i--) {
               result.add(matrix[i][left]);
           }
           left++;
           if (left > right) {
               break;
           }
       }
       return result;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72721.html

相关文章

  • LeetCode 精选TOP面试题【51 ~ 100】

    摘要:有效三角形的个数双指针最暴力的方法应该是三重循环枚举三个数字。总结本题和三数之和很像,都是三个数加和为某一个值。所以我们可以使用归并排序来解决这个问题。注意因为归并排序需要递归,所以空间复杂度为 ...

    Clect 评论0 收藏0
  • 【刷算法】时针打印矩阵

    摘要:题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵则依次打印出数字解题传入的参数为或者不是数组或者是空数组传入的是一维数组 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1...

    Terry_Tai 评论0 收藏0
  • 剑指offer系列——剑指 Offer 06. 从尾到头打印链表(C语言)

    摘要:导航小助手剑指从尾到头打印链表题目详情解题思路源代码总结剑指从尾到头打印链表题目详情输入一个链表的头节点,从尾到头反过来返回每个节点的值用数组返回。时间复杂度方法先反转链表并求长度,在将反转后的链表数据拷贝至数组中。 ...

    DevTTL 评论0 收藏0
  • 剑指Offer:机器人的运动范围

    摘要:例如,当为时,机器人能够进入方格,因为。请问该机器人能够达到多少个格子分析这题和上题剑指矩阵中的路径属于同一类型的题目。 题目 {% cq %} 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 1...

    CoderBear 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<