将正方形矩阵顺时针转动 90°

将正方形矩阵顺时针转动 90°

【题目】

给定一个 N×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×M,一共就有 M-1 组,分别进行占据调整即可。

java 复制代码
public class rotateEdge {
    public int[][] rotate(int[][] matrix){
        if(matrix.length==0)
        {
            throw new RuntimeException();
        }
        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--);
        }
        return matrix;
    }

    public void RotateEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
        int times=dC-tC;
        int temp;
        for(int i=0;i<times;i++)
        {
            temp=matrix[tR][tC+i];
            matrix[tR][tC+i]=matrix[dR-i][tC];
            matrix[dR-i][tC]=matrix[dR][dC-i];
            matrix[dR][dC-i]=matrix[tR+i][dC];
            matrix[tR+i][dC]=temp;
        }
    }
}
相关推荐
游是水里的游39 分钟前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_39 分钟前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
南城花随雪。1 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Noah_aa1 小时前
代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)
数据结构
KpLn_HJL2 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
程序员老冯头3 小时前
第十五章 C++ 数组
开发语言·c++·算法
AC使者8 小时前
5820 丰富的周日生活
数据结构·算法