01.文章目录
02.问题描述
矩阵是线性代数中的基本概念,说白了在编程中就是多维数组的体现。
旋转矩阵:通过旋转矩阵得到一个与原矩阵数据存储顺序不同的矩阵。
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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]
]
03.思路
这里说一下思路,不增加额外空间,我其实也没想到怎么做,去搜了下,思路有了就好整了。
思路:先交换左右两边的数据,然后在交换对角线,对角线你怎么选择都是一样的,没区别。
这里用C语言和C++两种方式实现(只贴核心代码)
04.代码实现
- C语言版
void rotate(int** matrix, int matrixSize, int* matrixColSize)
{
int* col = matrixColSize;
int row = matrixSize;
//左右交换
for(int i = 0; i < *col; i++)
{
for(int j = 0; j < row/2; j++)
{
int tmp = matrix[i][j];
matrix[i][j] = matrix[i][row-1-j];
matrix[i][row-1-j] = tmp;
}
}
//对角线交换
for(int i = 0; i < *col; i++)
{
for(int j = 0; j < row-i; j++)
{
int tmp = matrix[i][j];
matrix[i][j] = matrix[*col-1-j][*col-1-i];
matrix[*col-1-j][*col-1-i] = tmp;
}
}
}
- C++版
class Solution {
public:
void rotate(vector<vector<int>>& matrix)
{
int len=matrix[0].size();
for(int i=0;i<len;i++) //左右交换
{
for(int j=0;j<len/2;j++)
{
int temp=matrix[i][j];
matrix[i][j]=matrix[i][len-1-j];
matrix[i][len-1-j]=temp;
}
}
//对角线交换
for(int i=0;i<len;i++)
{
for(int j=0;j<len-i;j++)
{
int temp=matrix[i][j];
matrix[i][j]=matrix[len-1-j][len-1-i];
matrix[len-1-j][len-1-i]=temp;
}
}
}
};
05.总结
挺简单的,但是应该学过线代的人做这个会更简单吧。感觉C版本的第三个参数多余。
跟着思路就很简单,大家可以动手试试。
版权声明:转载请注明出处,谢谢!