📜  原地旋转方阵 90 度 |设置 1(1)

📅  最后修改于: 2023-12-03 14:50:31.516000             🧑  作者: Mango

原地旋转方阵 90 度

在编程中,经常会遇到需要将方阵旋转的情况。而原地旋转方阵90度是一种比较经典的问题。如果我们只是在纸上画图旋转90度很简单,但是在编程中,如果要保持原数组不动,同时又要将原数组旋转90度,则需要一定的技巧。

问题描述

给定一个n x n的方阵,将该方阵原地旋转90度。即每个元素在原地做90度的旋转。

例如: 原始方阵:

1  2  3
4  5  6
7  8  9

旋转后的方阵:

7  4  1
8  5  2
9  6  3
算法分析

我们可以分别将方阵分为n/2层。对于每一层,我们从该层第一个元素开始,以顺时针方向进行旋转。具体步骤如下:

  1. 对于每一层,向右旋转时,顶部元素被替换为右侧元素,右侧元素被替换为底部元素,底部元素被替换为左侧元素,左侧元素被替换为顶部元素。
  2. 对于每一层,右上角的元素在该层进行旋转时,该元素不会被替换到最后一项,所以该元素需要单独处理。
  3. 对于每一层,假设该层一共有n个元素,那么我们只需要执行n-1次旋转就可以完成旋转操作。

具体的旋转操作如下:

temp = arr[i][j]   // 保存当前元素值

arr[i][j] = arr[n-1-j][i]   // 将左侧元素替换为底部元素

arr[n-1-j][i] = arr[n-1-i][n-1-j]   // 将底部元素替换为右侧元素

arr[n-1-i][n-1-j] = arr[j][n-1-i]   // 将右侧元素替换为顶部元素

arr[j][n-1-i] = temp   // 将顶部元素替换为左侧元素
代码实现

以下为Python实现该算法的代码,时间复杂度为$O(n^2)$。

def rotate(matrix):
    n = len(matrix)
    for i in range(n//2):
        for j in range(i, n-1-i):
            temp = matrix[i][j]
            matrix[i][j] = matrix[n-1-j][i]
            matrix[n-1-j][i] = matrix[n-1-i][n-1-j]
            matrix[n-1-i][n-1-j] = matrix[j][n-1-i]
            matrix[j][n-1-i] = temp
    return matrix

matrix = [[1,2,3],[4,5,6],[7,8,9]]
result = rotate(matrix)
print(result)

# 输出: [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

以上代码运行结果为:

[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
总结

原地旋转方阵90度问题是一道非常经典的算法问题,解决该问题不仅可以提高算法的能力,而且可以提高对于数组操作技巧的认识。希望本篇介绍可以对于读者们带来一些帮助。