旋转矩阵

1612a1cc84e52f8fd81d36aa1787d94b.gif

关注下方公众号,分享硬核知识

作者 | 小K

出品 | 公众号:小K算法 (ID:xiaok365)

01

故事起源

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

2d2bb26bd45c67888210e9eff952cf39.png

02

分析

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

07176ce2c66633912687ad9cfa0b3625.png

03

模拟

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

3fec4214e5686dc99e8e5cfd02e87d87.png

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

123ee7c17da113d4c12f2ff97e702923.png

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

0a1e96b56951fd59827933e615f92a31.png

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

while (还没填满) {
    // 向右直到边界
    j++;
    // 向下直到边界
    i++;
    // 向左直到边界
    j--;
    // 向上直到边界
    i--;
}

04

细节

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

94b7a8d26bffa7e6db00e89367937319.png

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

bc0747f34d1b6104fbc93b9ca5226734.png

其余2个过程同理。

05

代码实现

#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

总结

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

本文原创作者:小K,一个思维独特的写手。
文章首发平台:微信公众号【小K算法】。

如果喜欢小K的文章,请点个关注,分享给更多的人,小K将持续更新,谢谢啦!

d5964999a9e64d8d0242ddfe46d70fcd.gif

关注下方公众号,分享硬核知识

e3a4f9482a37df9ecda0b3200615005a.gif

关注我,涨知识

4c460f8083a8337ce31a59bfca94c360.gif

原创不易,感谢分享

转发,点赞,在看

往期精彩回顾

一种比线段树还高效的区间算法

第一次拆Macbook,手有点抖...

一个简单的求和问题,却难住了很多人

91d9b29305f7594022d2a760d5014385.gif

分享给更多朋友,转发,点赞,在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值