LeetCode048——旋转图像

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/rotate-image/description/

题目描述:

知识点:数组

思路:模拟手工“旋转”的过程

如果题目没有“原地”旋转这一要求,是很简单的一道题,我们只需要新建一个一模一样大小的二维数组,按照规律填入数据即可。

既然题目有了“原地”旋转这一要求,我们应该怎么做呢?

其实只要我们在草稿纸上计算清楚旋转的规律就很简单。对于一个矩形,它有4条边,对于它的旋转,其实是4个位置之间的交换。那么,是哪4个位置之间的交换呢?以示例2所给矩阵中(0, 0)位置为例,如果旋转,有如下规律:

(3, 0) -> (0, 0)

(3, 3) -> (3, 0)

(0, 3) -> (0, 0)

(0, 0) -> (0, 3)

同理,对于(0, 1)位置,有如下旋转规律:

(2, 0) -> (0, 1)

(3, 2) -> (2, 0)

(1, 3) -> (3, 2)

(0, 1) -> (1, 3)

同理,对于(0, 2)位置,有如下旋转规律:

(1, 0) -> (0, 2)

(3, 1) -> (1, 0)

(2, 3) -> (3, 1)

(0, 2) -> (2, 3)

对于(0, 3)位置,我们已经在处理(0, 0)位置的旋转中涉及了该值,我们不该再继续旋转

按照这个规律,我们从最外层一直旋转到最内层,直至不能旋转为止。其旋转层数与矩阵阶数的规律如下:

矩阵阶数旋转层数
00
10
21
31
42

因此,对于n阶矩阵,我们需要旋转的层数是n / 2。

时间复杂度上,对于n阶矩阵我们需要旋转n / 2层,而对于第k层(k从0开始计数),我们需要旋转n - 1 - 2k个位置,因此其时间复杂度是O(n ^ 2)级别的。而对于空间复杂度,我们是“原地”旋转,空间复杂度是O(1)级别的。

JAVA代码:

public class Solution {

	public void rotate(int[][] matrix) {
		int n = matrix.length;
		for (int k = 0; k <= n / 2; k++) {
			for (int i = k; i < n - 1 - k; i++) {
				int temp = matrix[k][i];
				matrix[k][i] = matrix[n - 1 - i][k];
				matrix[n - 1 - i][k] = matrix[n - 1 - k][n - 1 - i];
				matrix[n - 1 - k][n - 1 - i] = matrix[i][n - 1 - k];
				matrix[i][n - 1 - k] = temp;
			}
		}
    }
}

LeetCode解题报告:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值