01.文章目录
文章目录
01.文章目录02.问题描述03.思路04.代码实现05.总结
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版本的第三个参数多余。 跟着思路就很简单,大家可以动手试试。 版权声明:转载请注明出处,谢谢!