【力扣】【Leetcode 48】旋转图像|对称矩阵 | 矩阵转置
给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。
你必须在** 原地** 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]提示:
n == matrix.length == matrix[i].length1 <= n <= 20-1000 <= matrix[i][j] <= 1000
参考解法:
class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); int tmp; // 临时变量 // 1. 上下翻转 // 对称行号 = 最后一行号 - 当前行号 for (int i = 0; i < n / 2; i++) { for (int j = 0; j < n; j++) { tmp = matrix[i][j]; matrix[i][j] = matrix[n - 1 - i][j]; matrix[n - 1 - i][j] = tmp; } } // 2. 主对角线翻转 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { tmp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = tmp; } } } };完整解法(由LLM辅助生成):
#include <iostream> #include <vector> #include <algorithm> // swap using namespace std; int main() { int n; cin >> n; vector<vector<int>> matrix(n, vector<int>(n)); // 输入 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> matrix[i][j]; } } // 旋转 90 度 // 1. 上下翻转 for (int i = 0; i < n / 2; i++) { swap(matrix[i], matrix[n - 1 - i]); } // 2. 对角线翻转 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } // 输出 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << matrix[i][j] << " "; } cout << endl; } return 0; }注解:以上涉及的swap函数相当于
void swap(a, b){ tmp = a; a = b; b = tmp; }