《leetCode》:Rotate Image

题目

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结果如下:
《leetCode》:Rotate Image_第1张图片

深入

题目最后一句话为

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++)
《leetCode》:Rotate Image_第2张图片

解决的方法:for(int k=0;k<matrixRowSize-1-2*i;k++)
k的范围应该为matrixRowSize-1-2*i

AC结果:
《leetCode》:Rotate Image_第3张图片

你可能感兴趣的:(LeetCode,Matrix,2d,rotateArr)