当前位置: 首页 > article >正文

力扣-数组-59 螺旋矩阵Ⅱ

思路1

记录当前前进方向,然后在到达上下左右的边界时,分别进行处理

代码1

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector< vector<int> > res;
        for(int i = 0; i < n; i++){
            vector <int> r;
            for(int j = 0; j < n; j++){
                r.push_back(0);
            }
            res.push_back(r);
        }

        int num = 1;
        int flag = 0;// 0 right 1 down 2 left 3 up
        int right = n - 1, down = n - 1, left = 0, up = 1;
        int i=0, j = 0;    

        while(num <= n*n){
            res[i][j] = num;
            if(flag == 0){
                if(j < right){
                    j++;
                }else{
                    flag = (flag + 1) % 4;
                    right -= 1;
                    i++;
                }
            }else if(flag == 1){
                if(i < down){
                    i++;
                }else{
                    flag = (flag + 1) % 4;
                    down -= 1;
                    j--;
                }
            }else if(flag == 2){
                if(j > left){
                    j--;
                }else{
                    flag = (flag + 1) % 4;
                    left += 1;
                    i--;
                }
            }else if(flag == 3){
                if(i > up){
                    i--;
                }else{
                    flag = (flag + 1) % 4;
                    up += 1;
                    j++;
                }
            }


            num += 1;
        }

        return res;
                
    }
};

思路2

根据n分解为n/2圈,然后在一圈中用四个for循环更新边,最后更改下一圈的起始位置

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector< vector<int> > res;
        for(int i = 0; i < n; i++){
            vector <int> r;
            for(int j = 0; j < n; j++){
                r.push_back(0);
            }
            res.push_back(r);
        }

        int num = 1, count = n/2, startX = 0, startY = 0;
        int i = 0, j = 0;
        int offset = 1;
        while(count){
            for(j = startY; j < n - offset; j++){
                res[startX][j] = num;
                num++;
            }
            for(i = startX; i < n - offset; i++){
                res[i][j] = num;
                num++;
            }
            for(; j > startY; j--){
                res[i][j] = num;
                num++;
            }
            for(; i > startX; i--){
                res[i][j] = num;
                num++;
            }
            offset++;
            count--;
            startX += 1;
            startY += 1;
        }

        if(n % 2 == 1){
            res[startX][startY] = num;
        }

        return res;
                
    }
};


http://www.kler.cn/a/525948.html

相关文章:

  • 渗透测试技法之口令安全
  • C++模板初识
  • git push到远程仓库时无法推送大文件
  • 数据结构选讲 (更新中)
  • 17 一个高并发的系统架构如何设计
  • 论文阅读(二):理解概率图模型的两个要点:关于推理和学习的知识
  • 数据结构 队列
  • 深度大数据:从数据洪流到智能决策的革命性跨越
  • php接口连接数据库
  • 【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
  • Vue3的el-table-column增加跳转其他页面
  • 模型I/O功能之模型包装器
  • LeetCode题练习与总结:最长和谐子序列--594
  • 反向代理模块b
  • CF 764B.Timofey and cubes(Java实现)
  • 【Rust自学】17.2. 使用trait对象来存储不同值的类型
  • Java内存模型 volatile 线程安全
  • 为AI聊天工具添加一个知识系统 之71 详细设计 之12 形式文法、范式语法和惯式用法
  • 2024 ICLR Spotlight Learning-Feedback
  • 网络攻防实战指北专栏讲解大纲与网络安全法
  • C语言练习(32)
  • C++,STL,【目录篇】
  • Formality:黑盒(black box)
  • 基于RAG方案构专属私有知识库(开源|高效|可定制)
  • oracle中使用in 和 not in 查询效率分析
  • 控件【QT】