书籍将正方形矩阵顺时针转动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组,分别进行占据调整即可。

java 复制代码
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;
    }
    
}
相关推荐
Raink老师1 小时前
用100道题拿下你的算法面试(矩阵篇-2):求转置矩阵
算法·面试·矩阵
算法鑫探7 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue7 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5167 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX19 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白9 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin9 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449969 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf9 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer