题目
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
题目大意:将一个数组按顺时针旋转90度。
思路
如果能够借用一个一样大的空间还是比较好做的。
将matrix[i][j]拷贝到tempMatrix[j][matrixRowSize-1-i]即可;最后将其拷贝回去
实现代码如下:
void rotate(int** matrix, int matrixRowSize, int matrixColSize) {
if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
return;
}
//先开辟好存储空间
int **tempMatrix=(int **)malloc(matrixRowSize*sizeof(int *));
if(tempMatrix==NULL){
exit(EXIT_FAILURE);
}
for(int i=0;i<matrixRowSize;i++){
tempMatrix[i]=(int *)malloc(matrixColSize*sizeof(int));
if(tempMatrix[i]==NULL){
exit(EXIT_FAILURE);
}
}
//开始拷贝
for(int i=0;i<matrixRowSize;i++){
for(int j=0;j<matrixColSize;j++){
tempMatrix[j][matrixRowSize-1-i]=matrix[i][j];
}
}
//拷贝回去
for(int i=0;i<matrixRowSize;i++){
for(int j=0;j<matrixColSize;j++){
matrix[i][j]=tempMatrix[i][j];
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
借用一个相同大小的空间,思路比较简单,AC结果如下:
深入
题目最后一句话为
Could you do this in-place?
即要求我们不借用额外的数组来进行旋转,那么这种情况该如何来做呢???
/*
第二种思路:不借用额外的数组空间,以圈为单位进行变换
*/
#define N 4
void rotate(int** matrix, int matrixRowSize, int matrixColSize) {
if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
return;
}
// for(int i=0;i<matrixRowSize;i++){
// for(int j=0;j<matrixColSize;j++){
// printf("%d ",matrix[i][j]);
// }
// printf("\n");
// }
int temp=0;
int row=0;
int col=0;
int circleRow=0;
int circleCol=0;
//开始拷贝,以圈为单元
int circleNum=matrixRowSize/2;
for(int i=0;i<circleNum;i++){
circleRow=i;
circleCol=i;
for(int k=0;k<matrixRowSize-1-2*i;k++){
row=circleRow;
col=circleCol+k;
int preTemp=matrix[row][col];
for(int j=0;j<N;j++){//每一轮将产生4次交换
int curTemp=matrix[col][matrixRowSize-1-row];//先将此值保存
matrix[col][matrixRowSize-1-row]=preTemp;//把 matrix[row][col]给 matrix[col][matrixRowSize-1-row]
// printf("%d ",matrix[col][matrixRowSize-1-row]);
int temp1=col;
int temp2=matrixRowSize-1-row;
row=temp1;
col=temp2;
preTemp=curTemp;
}
}
}
// printf("\n");
// //拷贝回去
// for(int i=0;i<matrixRowSize;i++){
// for(int j=0;j<matrixColSize;j++){
// printf("%d ",matrix[i][j]);
// }
// // printf("\n");
// }
}
//测试代码
#define M 4
int main(void){
int **arr=(int **)malloc(M*sizeof(int *));
for(int i=0;i<M;i++){
arr[i]=(int *)malloc(M*sizeof(int));
}
int count=1;
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
arr[i][j]=count;
count++;
}
}
rotate(arr,M,M);
}
遇到的问题:即将内圈多旋转了一次。
产生问题的代码为for(int k=0;k<matrixRowSize-1-i;k++)
解决的方法:for(int k=0;k<matrixRowSize-1-2*i;k++)
k的范围应该为matrixRowSize-1-2*i
AC结果: