题目:给定二维数组,将其中每个点顺时针旋转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]
定范围:
实现代码:
思路:
得旋转公式:
找规律,取一些点,判断旋转前后的坐标关系,不难得出:
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]
实现代码:
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;
}
}
}
}