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

【力扣hot100题】(018)螺旋矩阵

题目不难,但做的过程很痛苦。

老是频频出错,一开始用的递归,遍历完的行/列就在原矩阵中去掉,不知道为什么老是在最后一个元素出错,反反复复改了很多遍,后来发现应该是去掉每一行的最后一个元素时行数不为零导致又会递归几遍,然后原来删除的数还在内存中又被遍历了,导致某些元素被遍历多次。

class Solution {
public:
    int direction=0;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.size()==0||matrix[0].size()==0) return {};
        int n=matrix.size();
        int m=matrix[0].size();
        vector<int> result;
        if(direction==0){
            for(int i=0;i<m;i++){
                result.push_back(matrix[0][i]);
            }
            matrix.erase(matrix.begin());
        }
        else if(direction==1){
            for(int i=0;i<n;i++){
                result.push_back(matrix[i][m-1]);
                matrix[i].pop_back();
            }
        }
        else if(direction==2){
            for(int i=m-1;i>=0;i--){
                result.push_back(matrix[n-1][i]);
            }
            matrix.pop_back();
        }
        else{
            for(int i=n-1;i>=0;i--){
                result.push_back(matrix[i][0]);
                matrix[i].erase(matrix[i].begin());
            }
        }
        direction=(direction+1)%4;
        vector<int> dg=spiralOrder(matrix);
        result.insert(result.end(),dg.begin(),dg.end());
        return result;
    }
};

递归很消耗空间,下面用循环再实现一遍:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        int direction=0;
        while(1){
            if(matrix.size()==0||matrix[0].size()==0) break;
            if(direction==0){
                for(int i=0;i<matrix[0].size();i++){
                    result.push_back(matrix[0][i]);
                }
                matrix.erase(matrix.begin());
            }
            else if(direction==1){
                for(int i=0;i<matrix.size();i++){
                    result.push_back(matrix[i][matrix[i].size()-1]);
                    matrix[i].pop_back();
                }
            }
            else if(direction==2){
                for(int i=matrix[0].size()-1;i>=0;i--){
                    result.push_back(matrix[matrix.size()-1][i]);
                }
                matrix.pop_back();
            }
            else if(direction==3){
                for(int i=matrix.size()-1;i>=0;i--){
                    result.push_back(matrix[i][0]);
                    matrix[i].erase(matrix[i].begin());
                }
            }
            direction=(direction+1)%4;
        }
        return result;
    }
};

相关文章:

  • 借助FastAdmin和uniapp,高效搭建AI智能平台
  • 基于Python的火车票管理系统的设计与实现
  • 使用jieba库进行TF-IDF关键词提取
  • 深入解析C++继承机制:从基础到多态实现
  • C++ STL常用算法之常用集合算法
  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.3.2参数高效微调:LoRA与适配器(Adapter)技术
  • 子网划分浅度解析
  • Kotlin基础知识学习(五)
  • Set,Map,WakeSet,WakeMap
  • 虚拟pinctrl驱动
  • ZGC初步了解
  • 【小技巧】如何查看容器的启动参数
  • Java 大视界 -- Java 大数据在智能电网电力市场交易数据分析与策略制定中的关键作用(162)
  • C++中的搜索算法实现
  • Chapters 15 16:What Is Architecture?Independence_《clean architecture》notes
  • 百人会上的蔚小理与「来的刚刚好」的雷军
  • 关于参加CSP-J/S认证需符合年龄条件的公告(2025年起)
  • Python PDF解析利器:pdfplumber | AI应用开发
  • 【什么是机器学习——多项式逼近】
  • 多线程 - 线程安全 2 -- > 死锁问题