【寒假每日一题】蛇形矩阵(个人练习)详细题解+推导证明(第三天)

前言

今天坚持下来了,哈哈,真不容易啊,21计划!!!

过两天好像要全民检测,会被关在家里,正好可以看看剧,做做题,人生啊
在这里插入图片描述

今天还是寒假每日一题,不是软广,不是硬广,只是个人练习,题目来自微软面试题,语法题。

不过leetcode上也有类似的题,应该是叫顺时针打印矩阵。

题目

输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

  • 输入共一行,包含两个整数n和m。

输出格式

  • 输出满足要求的矩阵。
  • 矩阵占n行,每行包含m个空格隔开的整数。

数据范围

  • 1 ≤ n , m ≤ 100 1≤n,m≤100 1n,m100
输入样例:
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打卡。

在这里插入图片描述

我是管小亮 CSDN认证博客专家 TensorFlow PyTorch 图像处理
纸上得来终觉浅,绝知此事要躬行

包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页