《LeetCode之每日一题》:126.旋转图像
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:126.旋转图像相关的知识,希望对你有一定的参考价值。
题目链接: 旋转图像
有关题目
给定一个 n × n 的二维矩阵 matrix 表示一个图像。
请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。
请不要 使用另一个矩阵来旋转图像。
示例 3:
输入:matrix = [[1]]
输出:[[1]]
示例 4:
输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]
提示:
matrix.length == n
matrix[i].length == n
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
题解
参考官方题解
法一:使用辅助数组
思路:
原矩阵中的第 i 行 的第 j 个元素,旋转90° 后
变为倒数第 i 列的 第 j 个元素
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int m = matrix.size();
auto matrix_new = matrix;
for (int i = 0; i < m; ++i){
for (int j = 0; j < m; ++j){
matrix_new[j][m - 1 - i] = matrix[i][j];
}
}
matrix = matrix_new;
}
};
时间复杂度:O(N ^ 2)
空间复杂度:O(N ^ 2)
法二:原地旋转
思路:
在解法一的基础上,我们通过四次旋转,发现可以回到原始位置
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
//matrix_new[j][n - 1 - i] = matrix[i][j];
//row = col(j), col = n - 1 - row(n - 1 - i);
int n = matrix.size();
for (int i = 0; i < n / 2; ++i){
for (int j = 0; j < (n + 1) / 2; ++j){
int 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;
}
}
}
};
法三:用翻转代替旋转
水平轴翻转:matrix[i][j] = matrix[n - 1 - i][j]
对角线翻转:matrix[n - 1 - i][j] = matrix[j][n - 1 - i]
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
//水平轴翻转
for (int i = 0; i < n / 2; ++i){
for (int j = 0; j < n; ++j){
int temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - i][j];
matrix[n - 1 - i][j] = temp;
}
}
//对角线翻转
for (int i = 0; i < n; ++i){
for (int j = 0; j < i; j++){
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
以上是关于《LeetCode之每日一题》:126.旋转图像的主要内容,如果未能解决你的问题,请参考以下文章