《leetCode》:Rotate Image

来源:互联网 发布:php九九乘法表 编辑:程序博客网 时间:2024/05/01 21:56

题目

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  4void 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  4int 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结果:

0 0
原创粉丝点击