前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >旋转矩阵

旋转矩阵

作者头像
小K算法
发布2022-04-18 15:46:00
5460
发布2022-04-18 15:46:00
举报
文章被收录于专栏:小K算法小K算法
作者 | 小K

01

故事起源

有这样的一种矩阵,从左上角开始,顺时针从外向里旋转,数字依次递增,如果给定任意行n、列m,请问如何输出这样的矩阵呢?

02

分析

这个问题第一眼就觉得很简单,为啥呢,因为规律很明显,问题描述都已经说的很清晰了,只要按照要求模拟一遍就行了。 如果现在让你把这个问题描述给其他人,你是不是也会这样来描述:一直向前走,无路可走向右转。。。

03

模拟

啥是模拟呢,模拟就是按照你的想法,机械的执行命令就可以了,没有啥算法可言,就像这个问题一样。

不过机器并不能听懂你的高级语言,所以需要翻译一下。

说机话 整个过程拆解为4个步骤: 从矩阵左上角开始向右直到边界;2)向下;3)向左;4)向上。 重复上面4个步骤,直到填满整个矩阵。

于是我们就得到了初步的框架:

代码语言:javascript
复制
while (还没填满) {
    // 向右直到边界
    j++;
    // 向下直到边界
    i++;
    // 向左直到边界
    j--;
    // 向上直到边界
    i--;
}

04

细节

从左向右,结束时j超出边界,需要j--。最上一行已填满,上边界下移,同时i也下移。

从上向下,结束时i超出边界,需要i--。最右一列已填满,右边界左移,同时j也左移。

其余2个过程同理。

05

代码实现

代码语言:javascript
复制
#define ROW 5
#define COLUMN 5
void main() {
    int left = 0, right = COLUMN - 1, top = 0, bottom = ROW - 1;
    int f[ROW][COLUMN], i = 0, j = 0, num = 1;
    while (i >= top && i <= bottom && j >= left && j <= right) {
        // left->right
        while (j <= right) {
            f[i][j++] = num++;
        }
        j--;
        top++;
        i++;
        // top->bottom
        while (i <= bottom) {
            f[i++][j] = num++;
        }
        i--;
        right--;
        j--;
        // right->left
        while (j >= left) {
            f[i][j--] = num++;
        }
        j++;
        bottom--;
        i--;
        // bottom->top
        while (i >= top) {
            f[i--][j] = num++;
        }
        i++;
        left++;
        j++;
    }
}

06

总结

模拟问题一般都比较简单,只需要把整个框架过程抽象出来,然后机械的实现即可。但偶尔也会遇到复杂的模拟,一般都是细节涉及的比较多,比如边界信息太多,或者过程太多等。不过这种问题很适合锻炼代码实现能力,多做就能达到“有思想就一定能实现”的状态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小K算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档