旋转矩阵
给定一个 的矩阵,要求就地,空间复杂度为 ,旋转九十度。
旋转矩阵,由外向内看,元素所在的层数是不变的,所以我们一层一层的迭代对每层进行旋转。对于每层来说,上面的元素到了右边,右边的元素到了下面,以此类推。
可以把上面的元素全部拷贝到某个数组,然后左边的元素拷贝过来,下面的元素拷贝到左边,以此类推,但是这样就占用了 的空间。与逐层移动思想类似,一次只移动一个元素即可,对应四边的四个元素交换位置,这样不会影响到其他元素,也同样达到了目的。
下面是算法实现:
public static void Rotate(int[,] matrix)
{
int n = matrix.GetLength(0);
for (int layer = 0; layer < n / 2; layer++)
{
int first = layer;
int last = n - 1 - layer;
for (int i = first; i < last; i++)
{
int offset = i - first;
// save top
int top = matrix[first, i];
// left -> top
matrix[first, i] = matrix[last - offset, first];
// bottom -> left
matrix[last - offset, first] = matrix[last, last - offset];
// right -> bottom
matrix[last, last - offset] = matrix[i, last];
// top -> right
matrix[i, last] = top;
}
}
}
算法的时间复杂度是 ,应该说已经是最优的了,因为旋转矩阵,至少要把 个元素都移动一次。