题目:Rotate Image
旋转一个NxN的矩阵90度
要求常数空间复杂度。
思路:
从最外围开始,将第一行转到最后一列,最后一列转到最后一行,最后一行转到第一列,这是一个周期。
然后分别考虑上面周期中每个数的坐标对应关系。
例如:An*n:
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
a30 a31 a32 a33
则:a00->a03->a33->a30->a00
a01->a13->a32->a20->a01
a02->a23->a31->a10->a02
第一列到第二列是ai,j->aj,n-i-1
第二列到第三列是ai,j->aj,n-i-1
第三列到第四列是ai,j->aj,n-i-1
第四列到第五列是ai,j->aj,n-i-1
于是可以得到坐标的转换规律。
/*************************************************************************************************** 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? ***************************************************************************************************/ #include<stdio.h> void rotate(int** matrix, int matrixRowSize, int matrixColSize) { int i,j,k,temp,head = 0,tail = matrixRowSize - 1; while(head <= tail){ for(i = head;i < tail;i++){//转换一圈的坐标 j = matrixRowSize - head - 1; k = matrixRowSize - i - 1; temp = matrix[head][i]; matrix[head][i] = matrix[k][head]; matrix[k][head] = matrix[j][k]; matrix[j][k] = matrix[i][j]; matrix[i][j] = temp; } head++; tail--; } } void main(){ int num = 5; //int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};//注意int**和int (*)[]的区别,int (*)[]是指向数组的指针,数组首址不可变 int **a = (int **)malloc(num*sizeof(int *)); for(int i = 0;i < num;i++){ a[i] = (int *)malloc(num*sizeof(int)); for(int j = 0;j < num;j++){ a[i][j] = num*i + j + 1; printf("%d ",a[i][j]); } printf(" "); } rotate(a,num,num); for(int i = 0;i < num;i++){ for(int j = 0;j < num;j++) printf("%d ",a[i][j]); printf(" "); } }