寒假每日一题蛇形矩阵(个人练习)详细题解+推导证明(第三天)
Posted 我是管小亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题蛇形矩阵(个人练习)详细题解+推导证明(第三天)相关的知识,希望对你有一定的参考价值。
文章目录
前言
今天坚持下来了,哈哈,真不容易啊,21计划!!!
过两天好像要全民检测,会被关在家里,正好可以看看剧,做做题,人生啊
今天还是寒假每日一题,不是软广,不是硬广,只是个人练习,题目来自微软面试题,语法题。
不过leetcode上也有类似的题,应该是叫顺时针打印矩阵。
题目
输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
- 输入共一行,包含两个整数n和m。
输出格式
- 输出满足要求的矩阵。
- 矩阵占n行,每行包含m个空格隔开的整数。
数据范围
- 1 ≤ n , m ≤ 100 1≤n,m≤100 1≤n,m≤100
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
详细题解
写法1 O ( n 2 ) O(n^2) O(n2)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
int n, m;
int f[N][N];
int main()
cin >> n >> m;
int dx[] = -1, 0, 1, 0, dy[] = 0, 1, 0, -1;
int x = 0, y = 0, d = 1;
for (int i = 1; i <= n * m; ++ i )
f[x][y] = i;
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || f[a][b])
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
x = a, y = b;
for (int i = 0; i < n; ++ i )
for(int j = 0; j < m; ++ j )
cout << f[i][j] << " ";
cout << endl;
return 0;
毫无疑问,这是一道经典问题,力扣人称螺旋矩阵。
- 对于坐标方程,它的上下左右四个坐标,可以使用代码进行表示;
- 对于状态方程,它的右下左上四个状态,可以使用数值进行表示;
- 对于特殊状态,它的上下左右四个位置,可以使用坐标进行表示;
最后提交,AC😁
推导证明
本题的推导即为代码推导,按照y总的dp思考法,可以分为几个步骤。
- 首先是上面提到的三个情况;
- 然后是用一个坐标来存储每一个位置的数值;
- 接着是分别用两个坐标表示上下左右四个坐标;
- 之后是输出结果;
举一反三
可以使用LeetCode进行验证和扩展。
class Solution
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
vector<int> ans;
if(matrix.size()==0 || matrix[0].size()==0) return ans;
int l=0,r=matrix[0].size()-1,t=0,b=matrix.size()-1;
while(1)
for(int i=l;i<=r;++i) ans.push_back(matrix[t][i]);
if(++t>b) break;
for(int i=t;i<=b;++i) ans.push_back(matrix[i][r]);
if(--r<l) break;
for(int i=r;i>=l;--i) ans.push_back(matrix[b][i]);
if(--b<t) break;
for(int i=b;i>=t;--i) ans.push_back(matrix[i][l]);
if(++l>r) break;
return ans;
;
总结
继续努力,坚持更新,3rd打卡。
以上是关于寒假每日一题蛇形矩阵(个人练习)详细题解+推导证明(第三天)的主要内容,如果未能解决你的问题,请参考以下文章
寒假每日一题货仓选址(个人练习)详细题解+推导证明(第一天)
寒假每日一题找硬币(个人练习)详细题解+推导证明(第十二天)