参考自:《剑指Offer——名企面试官精讲典型编程题》
题目:顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
主要思路:
分4步:
第一步:从左到右打印一行;
第二步:从上到下打印一列;
第三步:从右到左打印一行;
第四步:从下到上打印一列;
其中,每一步根据起始和终止坐标打印。
每一步的前提条件:
第一步:必需的;
第二步:至少两行,即终止行号大于起始行号;
第三步:至少两行两列,即终止行号大于起始行号;且终止列号大于起始列号;
第四步:至少三行两列,即终止行号比起始行号至少大2;且终止列号大于起始列号;
关键点:每一步的前提条件
时间复杂度:O(row*column)
public class ClockwiseMatrix
{
private static ArrayList<Integer> result;
public static void main(String[] args)
{
int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
//int[][] matrix = {{1}};
printMatrixInClockwise(matrix);
System.out.println(result);
}
private static void printMatrixInClockwise(int[][] numbers)
{
if (numbers == null)
return;
int columns = numbers.length;
if (columns == 0) return;
int rows = numbers[0].length;
result = new ArrayList<>();
int start = 0;
//完整的一圈会遍历两行两列
while (columns > start * 2 && rows > start * 2)
{
printMatrixInCircle(numbers, columns, rows, start);
++start;
}
}
private static void printMatrixInCircle(int[][] numbers, int columns, int rows, int start)
{
int endX = columns - 1 - start;
int endY = rows - 1 - start;
// 从左到右打印一行
for (int i = start; i <= endX; ++i)
{
result.add(numbers[start][i]);
}
// 从上到下打印一列
if (start < endY)
{
for (int i = start + 1; i <= endY; ++i)
{
result.add(numbers[i][endX]);
}
}
// 从右到左打印一行
if (start < endX && start < endY)
{
for (int i = endX - 1; i >= start; --i)
{
result.add(numbers[endY][i]);
}
}
// 从下到上打印一行
if (start < endX && start < endY - 1)
{
for (int i = endY - 1; i >= start + 1; --i)
{
result.add(numbers[i][start]);
}
}
}
}