• 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)


    作者:翟天保Steven
    版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

    题目描述:

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

    数据范围:

    0 <= matrix.length <= 100

    0 <= matrix[i].length <= 100

    示例:

    输入:

    [[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]

    解题思路:

    本题考察算法场景模拟。两种解题思路。

    1)模拟边界

           将矩阵看成多层包裹,先顺时针遍历最外面一层,再进入里面一层继续遍历,直到上下左右边界交错。

    2)螺旋矩阵

           环带为一层遍历,边界为一层遍历。边界遍历又分为上下左右四个子部分。以“1+4”的组合遍历,完成螺旋矩阵

    测试代码:

    1)模拟边界

    1. class Solution {
    2. public:
    3. vector<int> printMatrix(vector<vector<int>> matrix) {
    4. vector<int> result;
    5. int size = int(matrix.size());
    6. // 处理矩阵为空的情况
    7. if(size == 0)
    8. return result;
    9. // 左边界
    10. int left = 0;
    11. // 右边界
    12. int right = matrix[0].size() - 1;
    13. // 上边界
    14. int up = 0;
    15. // 下边界
    16. int down = size - 1;
    17. // 循环直到边界交错
    18. while(left <= right && up <= down){
    19. // 上边界从左到右
    20. for(int i = left; i <= right; i++)
    21. result.push_back(matrix[up][i]);
    22. // 上边界向下一格,并判断上下边界位置是否交错
    23. up++;
    24. if(up > down)
    25. break;
    26. // 右边界从上到下
    27. for(int i = up; i <= down; i++)
    28. result.push_back(matrix[i][right]);
    29. // 右边界向左一格,并判断左右边界位置是否交错
    30. right--;
    31. if(left > right)
    32. break;
    33. // 下边界从右到左
    34. for(int i = right; i >= left; i--)
    35. result.push_back(matrix[down][i]);
    36. // 下边界向上一格,并判断上下边界位置是否交错
    37. down--;
    38. if(up > down)
    39. break;
    40. // 左边界从下到上
    41. for(int i = down; i >= up; i--)
    42. result.push_back(matrix[i][left]);
    43. // 左边界向右一格,并判断左右边界位置是否交错
    44. left++;
    45. if(left > right)
    46. break;
    47. }
    48. return result;
    49. }
    50. };

    2)螺旋矩阵

    1. class Solution {
    2. public:
    3. vector<int> printMatrix(vector<vector<int>> matrix) {
    4. int row = int(matrix.size());
    5. int col = int(matrix[0].size());
    6. // 处理矩阵为空的情况
    7. if(row == 0 || col == 0)
    8. return vector<int>(0);
    9. // 确认环数,环数与行列的最小值有关
    10. int minL = min(row, col);
    11. int ring = minL / 2 + minL % 2;
    12. // 螺旋矩阵遍历
    13. int count = row * col;
    14. int t = 0;
    15. vector<int> result(count);
    16. for(int k = 0; k < ring; ++k){
    17. // 当前环上边界遍历
    18. for(int p = k; p < col - k && t < count; ++p){
    19. result[t++] = matrix[k][p];
    20. }
    21. // 当前环右边界遍历
    22. for(int p = k + 1; p < row - k - 1 && t < count; ++p){
    23. result[t++] = matrix[p][col - k - 1];
    24. }
    25. // 当前环下边界遍历
    26. for(int p = col - k - 1; p >= k && t < count; --p){
    27. result[t++] = matrix[row - k - 1][p];
    28. }
    29. // 当前环左边界遍历
    30. for(int p = row - k - 2; p >= k + 1 && t < count; --p){
    31. result[t++] = matrix[p][k];
    32. }
    33. }
    34. return result;
    35. }
    36. };

  • 相关阅读:
    Vue Table表格动态展示列 Table表格自定义显示列 动态设置列是否展示 可拖拽设置列的显示顺序
    B站云E办Springboot+vue——前端项目完整版
    STM32的HAL库及其使用
    [单片机框架][bsp层][N32G4FR][bsp_flash] flash配置和使用
    shiro授权-SSM
    Nginx静态资源部署
    第七节:类和对象【一】【java】
    定义一个交通工具(Vehicle)的类
    迁移学习——ResNet152
    (学习日记)2022.7.21
  • 原文地址:https://blog.csdn.net/zhaitianbao/article/details/132553704