leetcode48:旋转图像

题目链接

leetcode

题目描述

给定一个 n×n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
必须在原地旋转图像,这意味着需要直接修改输入的二维矩阵,不要使用另一个矩阵。

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <vector>
using namespace std;

void printArray(const vector<vector<int>>& nums) {
cout << "[";
for (const vector<int>& num : nums) {
cout << "[";
for (const int& num2 : num) {
cout << num2 << ",";
}
cout << "], ";
}
cout << "]" <<endl;
}

/*
操作分解:直接操作旋转 90 度比较困难,将它分解成两个操作。
1.水平翻转:以中心的竖线为轴做翻转;
2.对角线翻转:以左上-右下对角条线(主对角线)为轴做翻转。

时间复杂度:O(n^2)
其中 n 是数组的长度。
空间复杂度:O(1)
*/
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty()) {
return;
}

int n = matrix.size();
// 水平翻转
for (int i = 0; i < n/2; i++) {
for (int j = 0; j < n; j++) {
swap(matrix[i][j], matrix[n-i-1][j]);
}
}
// 主对角线翻转
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};

// 辅助函数:打印二维数组
void printArray(const vector<vector<int>>& nums) {
cout << "[";
for (size_t i = 0; i < nums.size(); i++) {
cout << "[";
for (size_t j = 0; j < nums[i].size(); j++) {
cout << nums[i][j];
if (j != nums[i].size() - 1) cout << ",";
}
cout << "]";
if (i != nums.size() - 1) cout << ",";
}
cout << "]";
}

int main() {
Solution solution;
vector<vector<vector<int>>> nums = {
{{1,2,3}, {4,5,6}, {7,8,9}},
{{5,1,9,11}, {2,4,8,10}, {13,3,6,7}, {15,14,12,16}}
};

for (auto& num : nums) {
cout << "Input: matrix = ";
printArray(num);
cout << endl;

solution.rotate(num);
cout << "Output: ";
printArray(num);
cout << endl;
}

return 0;
}

leetcode48:旋转图像
https://lcf163.github.io/2023/11/02/leetcode48:旋转图像/
作者
乘风的小站
发布于
2023年11月2日
许可协议