《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
- LeetCode: Rotate Image
- [Leetcode] Rotate Image
- LeetCode : Rotate Image
- [LeetCode] Rotate Image
- leetcode 67: Rotate Image
- [leetcode] Rotate Image
- [Leetcode] Rotate Image
- [LeetCode]Rotate Image
- LeetCode-Rotate Image
- [leetcode] Rotate Image
- LeetCode - Rotate Image
- leetcode之Rotate Image
- LeetCode - Rotate Image
- Leetcode: Rotate Image
- LeetCode:Rotate Image
- Leetcode: Rotate Image
- Leetcode Rotate Image
- leetcode Rotate Image
- 前序创建二叉树+ 前序/中序/后序遍历二叉树
- 09-网站标题图片设置
- Nginx负载均衡配置实例详解
- get和post
- NSCache的使用,SDWebImage的使用,Reachability联网状态检测框架的使用
- 《leetCode》:Rotate Image
- 大话AlarmManage
- swift 重载 泛式 inout的使用
- android视图的一些总结
- 丹田练习小总结
- jsp乱码问题
- 当刘小立访问Google时,刘小立如何能访问? ---《计算机网络-自顶向下方法》
- android studio 如何设置代码区域的背景色
- OSGI的类加载机制