有关算法
算法对于程序猿呢,就像习武之人的内功;有空闲时间就练一练,总是有好处的
题目
给定一个n*n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。
举例:
输入: 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]]
解题思路
仔细看旋转之前二维矩阵和旋转之后二维矩阵之间的变化,可以得到:
- 二维矩阵先上下交换
- 再对角线替换
算法实现代码
void rotate(int matrix[][4], int matrixSize) {
int temp;
//上下交换
//得到
// 15 14 12 16
// 13 3 6 7
// 2 4 8 10
// 5 1 9 11
for (int i = 0; i < matrixSize/2; i++)
for (int j = 0; j < matrixSize; j++) {
temp = matrix[i][j];
matrix[i][j] = matrix[matrixSize - i - 1][j];
matrix[matrixSize - i - 1][j] = temp;
}
// 对角线交换 即可得到旋转二维矩阵
for (int i = 0; i < matrixSize - 1; i++) {
for (int j = i + 1; j < matrixSize; j++) {
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
完整代码
#include <stdio.h>
void rotate(int matrix[][4], int matrixSize) {
int temp;
for (int i = 0; i < matrixSize/2; i++)
for (int j = 0; j < matrixSize; j++) {
temp = matrix[i][j];
matrix[i][j] = matrix[matrixSize - i - 1][j];
matrix[matrixSize - i - 1][j] = temp;
}
for (int i = 0; i < matrixSize - 1; i++) {
for (int j = i + 1; j < matrixSize; j++) {
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
int main()
{
int matrix[4][4] = { {5,1,9,11},{2,4,8,10},{13,3,6,7},{15,14,12,16} };
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n\n\n");
rotate(matrix,4);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n\n\n");
return 0;
}
写在最后的话
不要认为算法在工作中用不到哦,都是可以用到的。
1. 比如这次顺时针旋转图片90度,在一些项目工作中就可以用到。Android Camera回到得到的图像数据就是需要顺时针旋转90度才可以竖着显示。
旋转90度之后就是获取到竖着的图像:
- 比如通过MediaProjection获取屏幕信息得到的图片是竖着的,把这张图片输入到编码器或者到底层做一些处理,那么就需要逆时针旋转90度之后再做后续处理