《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结果如下:

深入

题目最后一句话为

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结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值