三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

一天一道算法题(11):旋转数组的思路与实现解析

一天一道算法题(11):旋转数组的思路与实现解析

48. 旋转图像

给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。

你必须在** 原地** 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[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]]

思路

-复制数组暴力(不超时,但是题目不允许这样)

-原地旋转

funcrotate(matrix[][]int){n:=len(matrix)//计算圈数floors:=n/2+n%2forf:=0;f<floors;f++{i,j:=f,f//初始化第一个要交换的元素,即每一圈左上角的元素//循环结束的条件是 当前的列小于n-1-当前的圈数forj<n-f-1{//golang里面可以直接交换,别的编程语言可以引入temp来记录第一个元素的值继续交换matrix[i][j],matrix[n-1-j][i],matrix[n-1-i][n-1-j],matrix[j][n-1-i]=matrix[n-1-j][i],matrix[n-1-i][n-1-j],matrix[j][n-1-i],matrix[i][j]//交换完4个元素之后j++,向右移动一个单位,继续交换新的四个元素j++}}}

-两次翻转

结语

这道题的难点在于合理的设计交换的逻辑和循环的条件,没有思路的时候停下来多去列举被交换数字的下标,能很快发现下标变换规律,从而设计出正确的交换算法

如果喜欢该算法系列,欢迎大家关注订阅,我会经常更新力扣算法题解!!!

← 返回列表