这里是矩阵

张开发
2026/4/10 5:38:11 15 分钟阅读

分享文章

这里是矩阵
标题唐是因为要满五个字。矩阵矩阵我终于舍得碰你了螺旋矩阵模拟转圈的过程算模拟题其实开始写这篇的时候我还是没搞懂^^(我觉得有点像指针)希望在写的结尾我懂了模拟一圈一圈转一行一列转二维数组下标相当于坐标一圈转完记得缩小看代码随想录的视频思路倒是懂了在细节上依旧nonono找了个luogu的题自己先写写luoguP2239 [NOIP 2014 普及组] 螺旋矩阵自己写以为会AC的代码#include bits/stdc.h using namespace std; int nums[30000][30000]; int main() { int n, i, j; cin n i j; int x 0; int y 0; int val 1; int setoff 0; // 偏移量从0开始 while (setoff n / 2) { // 循环条件为圈数判断 // 上边界从左到右 for (x setoff; x n - setoff - 1; x) { nums[setoff][x] val; } // 右边界从上到下跳过角点 for (y setoff; y n - setoff - 1; y) { nums[y][n - setoff - 1] val; } // 下边界从右到左跳过角点 for (x n - setoff - 1; x setoff; x--) { nums[n - setoff - 1][x] val; } // 左边界从下到上跳过角点 for (y n - setoff - 1; y setoff; y--) { nums[y][setoff] val; } setoff; // 进入内层 } // 如果是奇数阶矩阵填充中心位置 if (n % 2 1) { nums[n / 2][n / 2] val; } cout nums[i-1][j-1] endl; // 输出指定位置的值注意索引从0开始 return 0; }实则大no特no会MLE内存限制问题Memory Limit Exceeded, MLE问题在于nums[30000][30000]内存浪费世界选择c的原因是什么灵活好用方便瞎编的这次问的千老师不是顶楼的千老师啊喂it said为了避免这个问题可以使用动态内存分配并且只在需要时分配内存加了以下代码依旧MLE......// 动态分配二维数组 int** nums new int*[n]; for (int k 0; k n; k) { nums[k] new int[n]; } //while循环体省略 // 释放动态分配的内存 for (int k 0; k n; k) { delete[] nums[k]; } delete[] nums;D老师说直接创建二维vectorvector会自动释放内存(但是在luogu里试了依旧不能解决MLE的问题)P2239 [NOIP 2014 普及组] 螺旋矩阵 - 洛谷 o而k之链接放这里解决超内存的题解五花八门后续慢慢看小萌鹅先学会螺旋矩阵的构造吧以下为力扣中的一道螺旋矩阵我按照我在luogu写的代码改编了一下发现会超出一位加上条件判断就不会了代码如下#include vector class Solution { public: std::vectorint spiralOrder(std::vectorstd::vectorint matrix) { int n matrix.size(); int m matrix[0].size(); std::vectorint ans; int x 0; int y 0; int val 0; int setoff 0; // 循环条件为偏移量小于行数和列数的一半 while (setoff * 2 n setoff * 2 m) { // 上边界从左到右 for (x setoff; x m - setoff; x) { ans.push_back(matrix[setoff][x]); } // 右边界从上到下 for (y setoff 1; y n - setoff; y) { ans.push_back(matrix[y][m - setoff - 1]); } // 处理只有一行或只有一列的特殊情况 if (n - 2 * setoff 1 m - 2 * setoff 1) { // 下边界从右到左 for (x m - setoff - 2; x setoff; --x) { ans.push_back(matrix[n - setoff - 1][x]); } // 左边界从下到上 for (y n - setoff - 2; y setoff; --y) { ans.push_back(matrix[y][setoff]); } } setoff; } return ans; } };一开始又犯了一个特别致命的错误直接索引空容器的下标了......虽然AC了依旧含有凑的成分在哈以下为一位大佬kaddy的题解:(清爽逻辑强)class Solution { public: vectorint spiralOrder(vectorvectorint matrix) { int nmatrix.size(); int mmatrix[0].size(); vectorint ans; int left0,top0,rightm-1,bottomn-1; while(ans.size()n*m) { for(int jleft;jright ans.size()n*m;j) ans.push_back(matrix[top][j]); top; for(int itop;ibottom ans.size()n*m;i) ans.push_back(matrix[i][right]); right--; for(int jright;jleft ans.size()n*m;j--) ans.push_back(matrix[bottom][j]); bottom--; for(int ibottom;itop ans.size()n*m;i--) ans.push_back(matrix[i][left]); left; } return ans; } };矩阵乘法等等后续编辑加上今日先END

更多文章