将正方形矩阵顺时针转动 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;
        }
    }
}
相关推荐
superlls12 分钟前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻38 分钟前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦1 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Ripple123122 小时前
数据结构:顺序表与链表
数据结构·链表
Jayden_Ruan2 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
一个响当当的名号2 小时前
B树,B+树,B*树(无代码)
数据结构·b树
点云SLAM3 小时前
C++ 常见面试题汇总
java·开发语言·c++·算法·面试·内存管理
叙白冲冲3 小时前
哈希算法以及面试答法
算法·面试·哈希算法
YuTaoShao4 小时前
【LeetCode 每日一题】1277. 统计全为 1 的正方形子矩阵
算法·leetcode·矩阵
古译汉书4 小时前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法