欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 书籍将正方形矩阵顺时针转动90°(8)0605

书籍将正方形矩阵顺时针转动90°(8)0605

2025/6/10 5:41:57 来源:https://blog.csdn.net/qq_30750287/article/details/148443714  浏览:    关键词:书籍将正方形矩阵顺时针转动90°(8)0605

题目
给定一个N x N的矩阵matrix,把这个矩阵调整成顺时针转动90°后的形式。

1        2        3        4

5        6        7        8

9       10      11      12

13      14      15      16

顺时针转动90°后为:

13        9        5        1

14        10      6        2

15        11      7        3

16        12       8        4

额外空间复杂度为O(1)。

解答

使用分圈处理的方式,在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵。比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。

1        2        3        4        

5                             8

9                            12

13     14       15      16

在这个外围圈中,1,4,16,13为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。然后2,8,15,9一组,继续占据调整的过程,最后3,12,14,5为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、(dR,dC)=(3,3)的子矩阵外层就调整完毕。接下来令tR和tC加1,即(tR,tC)=(1,1),令dR和dC减1,即(dR,dC)=(2,2),此时表示的子矩阵如下:

6        7        

10     11

这个外层只有一组,就是6,7,11,10,占据调整之后即可。所以,如果子矩阵的大小是M x M ,一共就有M-1组,分别进行占据调整即可。

public void totate(int[][] matrix){int tR = 0;int tC=0;int dR = matrix.length - 1;int dC = matrix[0].length - 1;while(tR < dR){rotateEdge(matrix,tR++,tC++,dR--,dC--);}
}public void rotateEdge(int[][] m,int tR, int tC, int dR, int dC){int times = dC - tC; times 就是总的组数int tmp = 0;for(int i = 0; i!= times;i++){//一次循环就是一组占据调整tmp = m[tR][tC + i];m[tR][tC+i] = m[dR - i][tC];m[dR - i][tC] = m[dR][dC-i];m[dR][dC - i] = m[tR + i][dC];m[tR + i][dC] = tmp;}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词