题目(顺时针打印矩阵)
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定 int 矩阵 mat,以及它的维数 nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
算法思路
先进行边界检查。
顺时针打印矩阵需要好几圈,那么自然需要循环去打印每一圈。所以首先确定循环结束的条件,这里可以由两种方式来判断结束。第一种是根据输出数组的元素个数是否达到了 n*m 个,第二个是假设每一圈的起点是(start,start),那么存在以下不等式 colums>startx2 并且 rows>startx2 使得循环成立。
接下来就需要打印每一圈,但是打印每一圈有可能分为需要打印一步,两步,三步,四步。那么第一步从左到右是都需要打印的情况,只要确定起始列号和终止列号即可;如果有必要打印第二步,那么需要保证起始行号要小于终止列号,否则该步没有元素可打印。如果有必要打印第三步,那么此时矩阵至少需要两行两列,所以除了终止行号大于起始行号,终止列号也要大于起始列号。同理,如果需要打印第四步,矩阵至少需要三行两列,因此要求终止行号大于起始行号,终止列号大于起始列号。
算法实现

复杂度分析
算法需要线性遍历每个矩阵元素,因而时间复杂度为 O(nxm),建立了一个输出数组,空间复杂度为 O(nxm)。
参考
<<剑指offer2>>