一、前言
力扣48.旋转图像
这道题要求把给定矩阵旋转90度,而且不答应利用额外矩阵来完成旋转图像。
于是这道题只能利用原地旋转的方法来办理
二、原地旋转
对于一个N=3的矩阵来说,只必要两次循环就可以完成了
- 将A1放到A3的位置,A3放到C3的位置,C3放到C1的位置,A1的位置放原C1的值
- 将A2放到B3的位置,B3放到C2的位置,C2放到B1的位置,A2的位置放原B1的值
也就是必要循环N - 1次
而对于一个N=4的,会出现两个环,每个环必要举行必要举行3次循环。
今后可以得出规律,对于每一个N × N的矩阵来说,都会有N / 2个环必要原地旋转,每个环必要循环N - 1 - i次,此中i为第几个环,由于环越往内,环的循环次数就越少。
- int n = matrix.length;
- int k = n / 2;
- for (int i = 0; i < k; i++) {
- for (int j = i; j < n - i - 1; j++) {
- // 交换
- }
- }
复制代码 于是,本题的关键就是必要确定四个必要互换数值的坐标的表达式
- 左上:(i, j)
- 左下:(n - j -1, i),**n - j -1是由于在同一个环中,行是会厘革的,而列却不会厘革,永世是同一列,随着环的厘革,列才会厘革!**比如N=4,第一次左上为A1,左下为D1;第二次左上为A2,而左下为C1;因此可以看出行是会跟着j厘革的,而列是跟着i厘革的。
- 右上:(j, n - i -1),行是跟着j厘革的,而列是跟着i厘革的,比如N=4,A1对应的是A4,A2对应的是B4,此中列随着环厘革而厘革,而行随着j厘革而厘革。
- 右下:(n - i -1, n - j - 1),和前面分析差不多
推算出来四个必要互换的下标后,这道题就完成了百分之九十了
- public void rotate(int[][] matrix) {
- int n = matrix.length;
- int k = n / 2;
- for (int i = 0; i < k; i++) {
- for (int j = i; j < n - i - 1; j++) {
- int t = matrix[i][j];
- matrix[i][j] = matrix[n - j - 1][i];
- matrix[n - j - 1][i] = matrix[n - i- 1][n - j - 1];
- matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
- matrix[j][n - i - 1] = t;
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |