当前位置: 首页 > 后端技术 > Python

LeetCode面试题01.07,旋转矩阵

时间:2023-03-26 14:53:00 Python

面试题01.07。旋转矩阵题目来源:https://leetcode-cn.com/problems/rotate-matrix-lcci题目给你一张由N×N矩阵表示的图像,其中每个像素的大小为4字节。请设计一个算法将图像旋转90度。不占用额外的内存空间就可以做到吗?示例1:给定矩阵=[[1,2,3],[4,5,6],[7,8,9]],就地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例2:给定矩阵=[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]],原地旋转输入矩阵,使其变为:[[15,13,??2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]解题思路:先用翻转代替旋转看例1:给定矩阵=[[1,2,3],[4,5,6],[7,8,9]],原位旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]题目要求选择旋转90度,逐行查看旋转后各元素坐标变化情况。第一行旋转后的变化:这里可以看到第一行的第n个元素旋转后变成了倒数第二列的第n个元素。第二行旋转后的变化:同理,第二行的第n个元素,经过选择后,就是倒数第二列的第n个元素。第三行也是如此。那么可以得出结论,原矩阵旋转后,原矩阵第i行的第j个元素会出现在倒数第i列的第j个位置。把上面的结论转化成代码。题目写的很清楚,矩阵是N*N,矩阵的长度设置为length,可以表示为:matrix[row][col]?matrix[col][length-row-1]现在,则需要将矩阵从左边的公式转换为右边的公式。本文采用翻转的思路。假设原矩阵水平翻转,则:matrix[row][col]?matrix[length-row-l][col]假设原矩阵在主对角线上翻转,则:matrix[row][col]?Matrix[col][row]仔细对比前面结论的变换公式,将两次翻转结合起来,先进行水平翻转,再进行主对角线翻转,则:matrix[row][col]?matrix[length-row-1][col]?matrix[col][length-row-1]产生与上面完全相同的公式。那么根据这个思路,可以对矩阵进行相应的翻转,得到最终的结果。还有一种翻转的方式,也可以达到最终的效果,如下:翻转原矩阵的主对角线,则:matrix[row][col]?matrix[col][row]垂直翻转原矩阵,则:matrix[row][col]?matrix[row][length-col-1]同理,结合两种翻转形式,先翻转主对角线,再垂直翻转,可以得到:matrix[row][col]?matrix[col][row]?matrix[col][length-row-1]对比上面结论中的公式,结论也是一致的。具体代码如下,采用第二种翻转方式。代码实现类解决方案:defrotate(self,matrix:List[List[int]])->None:"""不返回任何东西,就地修改矩阵。"""length=len(matrix)#carryout主对角线翻转foriinrange(length):forjinrange(i):matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]#执行垂直翻转foriinrange(length):forjinrange(length//2):matrix[i][j],matrix[i][length-j-1]=matrix[i][length-j-1],matrix[i][j]实现结果以上就是解决《面试题 01.07. 旋转矩阵》问题的主要内容,用翻转的思路代替旋转。欢迎关注微信公众号《书所集录》