LeetCode 48.旋转图像
解题思路:参考了leetcode官方的题解。最简单的方式是借助辅助的数组,将原数组中内容按照旋转规律放入辅助数组内,最后再将辅助数组中的内容放回原数组中。
注:只要返回的结果是原数组,就认为是对原数组进行了修改。像这里利用辅助数组,之后将数值深度拷贝到原数组中就可以。但不能拷贝引用(浅拷贝),比如最后原数组内容不是数值上的拷贝辅助数组,而是辅助数组的引用,这样的话,也不算修改了原数组。
除了上面借助辅助数组的方式实现原地旋转,还可以通过翻转实现。对原数组先水平翻转,再主对角线翻转就能实现数组原地旋转。具体可以参考leetcode官方题解。下面对这两种方法都进行一下代码实现:
代码实现:
//方法一:借助辅助数组
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
auto matrix_new = matrix;
for (int row = 0; row < n; ++row) {
for (int col = 0; col < n; ++col) {
matrix_new[col][n - row - 1] = matrix[row][col];
}
}
matrix = matrix_new;
}
};
//方法二:通过翻转实现
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
//水平翻转
for (int row = 0; row < n / 2; ++row) {
for (int col = 0; col < n; ++col) {
swap(matrix[row][col], matrix[n - row - 1][col]);
}
}
//主对角线翻转
for (int row = 0; row < n; ++row) {
for (int col = 0; col < row; ++col) {
swap(matrix[row][col], matrix[col][row]);
}
}
}
};