Leetcode hot100 旋转图像【中等】

凭直觉,很自然想到写个while循环由外向内一圈一圈弄,再想每一圈怎么弄。每一圈怎么弄,也是靠直觉。比如下面这个矩阵。

1 2 3 4 4

4 5 6 4 4

7 8 9 4 4

1 1 1 1 4

4 4 4 4 4

以最外圈举例,最外圈要这样走一遍,就能完成旋转。

====================================================

好了,思路有了,现在开始写代码了。

首先,直觉告诉我,每一圈的最左上角的元素,由于是(0,0)、(1,1)、(2,2)这种既能用来表示这是第几圈,又能用来判断是否走到最后一圈,同时横坐标和纵坐标还一样,具有这么多特性,那我必须得维护这个参数啊。由于是每一圈的起点位置,所以我管他叫start。

初始化,第一圈的时候 int start=0;

然后我们开始想退出while循环的条件:如果正方形的长度是奇数,那么最后剩一个元素,如果正方形的长度是偶数,那么最后一圈没有元素。我隐隐约约感受到,可以用start和矩阵长度之间的关系去判断。当起点(start,start)坐标到了长度n的一半的时候,就该退出了,具体是小于号还是小于等于号,列几个情况去分析一下。

每一圈的旋转咋写呢?首先要确定每一圈要转几个元素。

最外圈需要动4个元素,图中红框框出的这4个:

再往里一圈需要动2个元素,图中绿框框出的这2个:

分析一下,得到需要转动的元素个数int num=n-2*start-1;

接下来我们就要找每个元素旋转的规律了。先把所有元素的旋转先写下来,找规律,只需要写两圈的,就能看出来规律。

最外圈,start=0,num=4:

(0,0)<-(4,0)<-(4,4)<-(0,4)<-(0,0)

(0,1)<-(3,0)<-(4,3)<-(1,4)<-(0,1)

(0,2)<-(2,0)<-(4,2)<-(2,4)<-(0,2)

(0,3)<-(1,0)<-(4,1)<-(3,4)<-(0,3)

倒数第二圈:start=1,num=2

(1,1)<-(3,1)<-(3,3)<-(1,3)<-(1,1)

(1,2)<-(2,1)<-(3,2)<-(2,3)<-(1,2)

竖着看,我在图里写了几个,你找找感觉:

找到感觉后,整个规律就出来了:

matrix**startstart+i** <- matrixstart+num-istart <- matrix**start+numstart+num-i**<-matrixstart+i start+num** <- matrixstartstart+i**

还有一个视角,更快出规律,先用4个角去写:

start\]\[start\]**\<-** \[start+num\]\[start\]**\<-** \[start+num\]\[start+num\] **\<-** \[start\]\[start+num\]**\<-**\[start\]\[start

↓这是第0个,再考虑如何迁移到下一个(第i个)------行数如何变,列数如何变?

matrixstartstart****+i**** <- matrixstart+num****-i****start <- matrixstart+numstart+num****-i**** <-matrixstart****+i**** start+num <- matrixstartstart****+i****

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        //特殊情况
        if(n==1) return;

        int start=0;
        // n=3 start=1停下
        // n=4 start=2停下
        // n=5 start=2停下
        // n=6 start=3停下
        //由外到内一圈一圈的搞,直到最内圈是长度为1的小正方形,或者长度为0,停下
        while(start<n/2){
            // start=0,循环n-1次
            // start=1,循环6-(2start)-1次
            // start=2 循环1次 6-(2start)-1次
            int num=n-2*start-1;  //这一轮每一行有多少个要旋转的元素

            for(int i=0; i<num; i++){
                
                int temp=matrix[start][start+i];
                matrix[start][start+i]=matrix[start+num-i][start];
                matrix[start+num-i][start]=matrix[start+num][start+num-i];
                matrix[start+num][start+num-i]=matrix[start+i][start+num];
                matrix[start+i][start+num]=temp;
            }
            
            start++;//下一圈的起点是(start,start)
        }

    

     
    }
}
相关推荐
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者13 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者13 小时前
【征程6】校准量化中HistogramObserver解析
算法
OuO-214 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵