当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵:

  1. 1 2 3 4
  2. 5 6 7 8
  3. 9 10 11 12
  4. 13 14 15 16

则依次打印出数字:

  1. 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解法

剑指offer上的思路有点复杂,需要考虑坐标变换太多,考虑用另一种思路来解决。

在矩阵中,使用左上角坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个矩阵。比如题目中的矩阵,当(tR,tC) = (0,0)和(dR,dC) = (3,3)时,表示的子矩阵就是整个矩阵:

  1. 1 2 3 4
  2. 5 8
  3. 9 12
  4. 13 14 15 16

当外层循环遍历后,可以令tR和tC加1,dR和dC减1,执行内层循环。当左上角的坐标跑到右下角坐标的右方或者下方,则整个过程就终止。

  1. /**
  2. * @author mcrwayfun
  3. * @version 1.0
  4. * @description
  5. * @date Created in 2019/1/2
  6. */
  7. public class Solution {
  8. /**
  9. * 转圈打印矩阵
  10. * @param matrix 矩阵
  11. * @return 存放结果的list
  12. */
  13. public ArrayList<Integer> printMatrix(int[][] matrix) {
  14. ArrayList<Integer> reList = new ArrayList<>();
  15. if (matrix == null) {
  16. return reList;
  17. }
  18. int tR = 0;
  19. int tC = 0;
  20. int dR = matrix.length - 1;
  21. int dC = matrix[0].length - 1;
  22. while (tR <= dR && tC <= dC) {
  23. printMatrix(matrix, tR++, tC++, dR--, dC--, reList);
  24. }
  25. return reList;
  26. }
  27. public void printMatrix(int[][] matrix, int tR, int tC, int dR, int dC, ArrayList<Integer> reList) {
  28. // 只有一行
  29. if (tR == dR) {
  30. for (int i = tC; i <= dC; i++) {
  31. reList.add(matrix[tR][i]);
  32. }
  33. }
  34. // 只有一列
  35. else if (tC == dC) {
  36. for (int i = tR; i <= dR; i++) {
  37. reList.add(matrix[i][tC]);
  38. }
  39. } else {
  40. int curR = tR;
  41. int curC = tC;
  42. // 从左到右
  43. while (curC != dC) {
  44. reList.add(matrix[tR][curC]);
  45. curC++;
  46. }
  47. // 从上到下
  48. while (curR != dR) {
  49. reList.add(matrix[curR][dC]);
  50. curR++;
  51. }
  52. // 从右到左
  53. while (curC != tC) {
  54. reList.add(matrix[dR][curC]);
  55. curC--;
  56. }
  57. // 从下到上
  58. while (curR != tR) {
  59. reList.add(matrix[curR][tC]);
  60. curR--;
  61. }
  62. }
  63. }
  64. }

测试用例

  1. 数组中有多行多列;数组中只有一行;数组中只有一列;数组中只有一行一列。

该分类下的相关小册推荐: