• 54. 螺旋矩阵 & 59. 螺旋矩阵 II ●●


    54. 螺旋矩阵 ●●

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。


    在这里插入图片描述
    输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    输出:[1,2,3,4,8,12,11,10,9,5,6,7]

    • 模拟
      四条边按顺序遍历,移动、判断边界。
    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            int m = matrix.size();          // m 行
            int n = matrix[0].size();       // n 列
            int top = 0, right = n-1, left = 0, buttom = m-1; //边界索引值
            int numsize = m*n;
            int num = 0;
            vector<int> ans(numsize);
            while(true){
                for(int i = left; i <= right; i++){
                    ans[num++] = matrix[top][i];
                }
                top++;
                if(top>buttom) break;			// 遍历  判断边界
    
                for(int i = top; i <= buttom; i++){
                    ans[num++] = matrix[i][right];
                }
                right--;
                if(left>right) break;
    
                for(int i = right; i >= left;  i--){
                    ans[num++] = matrix[buttom][i];
                }
                buttom--;
                if(top>buttom) break;
    
                for(int i = buttom; i >= top; i--){
                    ans[num++] = matrix[i][left];
                }
                left++;
                if(left>right) break;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    59. 螺旋矩阵 II ●●

    给你一个正整数 n ,生成一个包含 1 到 n 2 n^2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix .


    在这里插入图片描述
    输入:n = 3
    输出:[[1,2,3],[8,9,4],[7,6,5]]

    1. 生成一个 n×n 空矩阵 ans,随后模拟整个向内环绕的填入过程:
    2. 定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 numsize = n * n;
    3. 当 num <= numsize 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
    4. 执行 num += 1:得到下一个需要填入的数字;
    5. 更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
    6. 使用 num <= numsize 而不是 l < r || t < b 作为迭代条件,是为了解决当 n 为奇数时,矩阵中心数字无法在迭代过程中被填充的问题
    7. 最终返回 ans 即可。

    在这里插入图片描述

    class Solution {
    public:
        vector<vector<int>> generateMatrix(int n) {
            vector<vector<int>> ans(n, vector<int>(n, 0));
            int up = 0, down = n-1, left = 0, right = n-1;
            int cnt = 1, num = n*n;
            while(cnt <= num){      // 迭代条件,填充数 <= 格子数
                for(int i = left; i <= right; ++i) ans[up][i] = cnt++;  // 右移 
                ++up;
                for(int i = up; i <= down; ++i) ans[i][right] = cnt++;  // 下移
                --right;
                for(int i = right; i >= left; --i) ans[down][i] = cnt++;    // 左移
                --down;
                for(int i = down; i >= up; --i) ans[i][left] = cnt++;   // 上移
                ++left;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    环信集成SDK
    Hive 多数组合并 CONCAT_WS
    基于京东micro-app微前端框架的项目实践
    vue 中为什么需要虚拟DOM、VDOM 是如何生成的、VDOM 如何做 diff 的?
    曼哈顿距离
    面试必备 JVM中垃圾回收用到的三色标记法
    Java-基于SSM的校园点餐管理系统
    推文项目进展如何
    【Transformers】第 9 章 :处理很少或没有标签
    SpringBoot自动装配原理及分析
  • 原文地址:https://blog.csdn.net/qq_19887221/article/details/125598585