LeetCode -- 顺时针旋转图片90度

题目:给定二维数组,将其中每个点顺时针旋转90度。


思路:
得旋转公式:
找规律,取一些点,判断旋转前后的坐标关系,不难得出:
a[i,j]变成了a[n-j,i], a[n-j,i]变成了a[n-i,n-j],a[n-i,n-j]变成了a[j,n-i],a[j,n-i]变成了a[i,j]
定范围:

对于外循环,只需要旋转一半的长度就可以。可以想象把正方形上下平分,拿着另一半旋转3次,每次转90度,最后刚好对齐。 因此i ∈ [0,n/2]


对于内循环,要从将要旋转的元素为起始,旋转n-i-1次,其中n=总长度,i=已经旋转的个数。 因此j 属于[i, n-i)。可以想象一个正方形铁环,一圈一圈的缩小(对于同一个元素不能被重复旋转)


实现代码:







public class Solution {
    
 private static bool IsMatrix(int[,] matrix){
 	if(matrix == null){
		return false;
	}
	
	for(var i = 0;i < matrix.GetLength(0); i++){
		if(matrix.GetLength(1) != matrix.GetLength(0)){
			return false;
		}
	}
	
	return true;
 }
 // clock direction
 public void Rotate(int[,] matrix) 
 {
     if(!IsMatrix(matrix)){
	 	return;
	 }
	 
	 var n = matrix.GetLength(0) - 1;
	 for(var i = 0;i <= n/2 + 1 ;i ++){
	 	for(var j = i;j < n-i; j++){
			var t = matrix[i,j];
			matrix[i,j] = matrix[n-j,i];
			matrix[n-j,i] = matrix[n-i,n-j];
			matrix[n-i,n-j] = matrix[j,n-i];
			matrix[j,n-i] = t;
			
		}
		
	 }
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值