本次刷题日记的第 66 篇,力扣题为:48. 旋转图像,中等
一、题目描述:
旋转图像,看上去明明是旋转表格,咋就旋转图像呢?
二、这道题考察了什么思想?你的思路是什么?
看看旋转图像这个题给我们讲述了哪些重要信息:
- 题目给出了一个二维的矩阵,是 n*n 的,意味着一定是正方形的,宽高一定是一样的
- 要求我们将上述的二维矩阵转顺时针旋转 90 度,而且要求我们在原来的地址上面修改,而不是返回一个结果
分析
题目很简短,表达的意思也很明确,留下的只有我们爱思考的小脑袋
仔细思考一下这个题,咱们暂时可以想到的解法可以有 2 个方向:
- 第一是直接在原来的数组上进行数据和数据之间的交换,不会引入额外过多的空间消耗
- 第二种便是,我们引入一个帮助的数组空间,处理完毕后,将帮助数据 copy 给原有的 matrix 数组
上述两种方式,相对无脑一点的自然是第二种,咱们可以稍加思考,对于一个矩阵,咱们遍历的时候是从左到有,从上到下
那就先来一个无脑的,毕竟比较容易上手
那么如果是要旋转 90 度,咱们还是按照同样的方法遍历的话,是不是对于原数组来说,就是从下到上,从左到右的遍历就可以了?
理论上常规遍历是这样的:
那么旋转 90 度的时候,我们可以理解成是这样的:
看了这个图,我们是不是就可以理解如果我们引入一个帮助空间,按照左图的逻辑遍历原有数组,数据给到帮助空间中,最后将帮助空间拷贝给到原有数组空间上
其实看到这个图就非常好理解了,接下来就是编码实现的过程了,注意遍历的顺序
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
编码如下:
func rotate(matrix [][]int) { n := len(matrix) help := make([][]int, n) for i := range help { help[i] = make([]int, n) } for i, row := range matrix { for j, v := range row { help[j][n-1-i] = v } } copy(matrix, help) }
四、总结:
这种实现方式看上去还是比较简单的,思路清晰的话,实现起来就会很方便,可以看出时间复杂度是 O(n^2) ,咱们是遍历了每一个格子
空间复杂度也是 O(n^2) , 咱们开辟了一个 help 二维数组,引入了额外的空间消耗
当然,我们也可以选择思考第一种方式来解这个题,咱们就要好好找旋转前和旋转后矩阵每个格子之间的关系了,再会
原题地址:48. 旋转图像
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~