将正方形矩阵顺时针转动 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;
        }
    }
}
相关推荐
X同学的开始1 小时前
数据结构之二叉树遍历
数据结构
limingade2 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
AIAdvocate4 小时前
Pandas_数据结构详解
数据结构·python·pandas
jiao000014 小时前
数据结构——队列
c语言·数据结构·算法
kaneki_lh4 小时前
数据结构 - 栈
数据结构
铁匠匠匠4 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6256 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林6 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先