首页 > 编程语言 >LeetCode100之旋转图像(48)--Java

LeetCode100之旋转图像(48)--Java

时间:2024-11-08 23:20:11浏览次数:3  
标签:layer Java matrix 48 nums -- 旋转 int length

1.问题描述

  给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

        示例1

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

        示例2 

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

        提示

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

        难度等级

                中等

        题目链接

        旋转图像

2.解题思路

        这道旋转图像的题,只要找到其中的规律,做起来十分简单。我们不难发现,这里的旋转,就是将数顺时针的转一圈,而且我们还可以发现,一个4*4的矩阵,如果将最外一层顺时针旋转一圈,我们就可以将选择一个4*4的矩阵问题,变成一个旋转3*3的矩阵问题。也就是说,我们每旋转一圈,需要旋转的矩阵就会变小,直到变成一个1*1的矩阵,无法再旋转,问题就解决了。

        所以,解决这道题的关键,就是如何顺时针旋转最外层的数。这个问题也不能解决,我们可以把它分成四部分,把下面移到左边、左边移到上边、上边移到右边,右边移到下边四个部分。

        我们可以定义一个layer变量来记录已经旋转的层数,我们一共要旋转n / 2层。我们每旋转一层,下一层需要旋转的个数就减少2个。

        //层数
        int layer = 0;
        while(layer < matrix.length / 2){
            //每次转移的个数
            int nums = matrix.length-1-2*layer;
            ......

}

        我们要将四个方向的数进行旋转,首先得创建一个临时数据来存储其中一个方向的数,相当于把一边拆出来,然后将其它三边转一圈,然后再把拆出来的那一边安装回去。

            //创建一个临时数组
        int[] temp = new int[nums];
        //初始化临时数组(存上)
        for(int i = 0;i < nums;i++){
            temp[i] = matrix[layer][i+layer];
            
        }

        我们可以就像拼积木一样,将左边的积木移动到上边。

        //左->上
        for(int i = 0;i < nums;i++){
            matrix[layer][i+layer] = matrix[matrix.length-1-i-layer][layer];
        }

        再将下边的积木移动到左边。

        //下->左
        for(int i = 0;i < nums;i++){
            matrix[matrix.length - 1 -i -layer][layer] = matrix[matrix.length-1-layer][matrix.length-1-i - layer];
        }

        再将右边的积木移动到下边。

        //右到下
        for(int i = 0;i < nums;i++){
            matrix[matrix.length-1-layer][matrix.length-1-i-layer] = matrix[i+layer][matrix.length-1-layer];
        }

        最后再将存在临时数组中的积木(上边的)安装会右边。

        //上到右
        for(int i = 0;i < nums;i++){
            matrix[i+layer][matrix.length-1-layer] = temp[i];
        }

        我们移动完一圈的积木之后,就将层数加1,变成旋转(n-1)*(n-1)的矩阵的问题。

        //层数增加
        layer++;

3.代码展示

class Solution {
    public void rotate(int[][] matrix) {
        //层数
        int layer = 0;
        while(layer < matrix.length / 2){
            //每次转移的个数
            int nums = matrix.length-1-2*layer;
            //创建一个临时数组
        int[] temp = new int[nums];
        //初始化临时数组(存上)
        for(int i = 0;i < nums;i++){
            temp[i] = matrix[layer][i+layer];
            
        }
        //左->上
        for(int i = 0;i < nums;i++){
            matrix[layer][i+layer] = matrix[matrix.length-1-i-layer][layer];
        }
        //下->左
        for(int i = 0;i < nums;i++){
            matrix[matrix.length - 1 -i -layer][layer] = matrix[matrix.length-1-layer][matrix.length-1-i - layer];
        }
        //右到下
        for(int i = 0;i < nums;i++){
            matrix[matrix.length-1-layer][matrix.length-1-i-layer] = matrix[i+layer][matrix.length-1-layer];
        }
        //上到右
        for(int i = 0;i < nums;i++){
            matrix[i+layer][matrix.length-1-layer] = temp[i];
        }
        //层数增加
        layer++;
        }
    }
}

4.总结

        这道题其实很简单,就是不断的旋转外圈,不断的缩小矩阵,直到变成一个1*1的矩阵,问题就解决了。好了,这道题就讲到这里了,祝大家刷题愉快~

标签:layer,Java,matrix,48,nums,--,旋转,int,length
From: https://blog.csdn.net/2301_79318558/article/details/143485693

相关文章

  • LeetCode100之买卖股票的最佳时机含冷冻期(309)--Java
    1.问题描述   给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。        注意......
  • 20222312 2024-2025-2 《网络与系统攻防技术》实验四报告
    一、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者(1).通过kali中的file命令查看文件格式和可运行平台,即exe文件,Win32平台通过PEID查壳文件发现使用UPX壳二、使用IDAPro静态或动态分析crackm......
  • 数学笑话合集
    Arxiv上一篇数学笑话收集,由数学家TanyaKhovanova撰写(2403.01010)文章内容摘要多年来,我一直在我的网站上收集和发布数学笑话。那里有超过400个笑话。在这篇论文中,它是我在G4G15会议上演讲的扩展版本,我想呈现其中的66个笑话。1数学家与幽默数学家非常逻辑和精确。这里有......
  • 点阵LED电路分析
    以点阵的左上角LED为例,即A1LED为例,进行电路分析9号脚接着LED的阳极,所以9号脚需是高电平,13号脚连着LED的阴极,所以13号脚需是低电平9号脚连接着Q10的集电极,欲使9号脚为高电平,则需要Q10导通Q10的发射极连接着+5V电压,欲使Q10导通,则基极需为低电平,即LEDC0为低电平欲使13号脚低电......
  • 基于微信小程序的婚庆摄影系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......
  • Java后端请求想接收多个对象入参的数据方法
    在Java后端开发中,如果我们希望接收多个对象作为HTTP请求的入参,可以使用SpringBoot框架来简化这一过程。SpringBoot提供了强大的RESTfulAPI支持,能够方便地处理各种HTTP请求。1.示例:使用SpringBoot接收包含多个对象的HTTP请求以下是一个详细的示例,展示了如何使用SpringBoot接......
  • 基于微信小程序的考研资料分享系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......
  • 链表
    链表部分(链表)707.设计链表(模版,通过了valgrind测试)实现单向链表,即每个节点仅存储本身的值和后继节点。除此之外,我们还需要一个哨兵(sentinel)节点作为头节点,和一个size参数保存有效节点数。如下图所示。初始化时,只需创建头节点head和size即可。实现get(index)时,......
  • 农经权中如何利用地块信息表、家庭成员表、合同面积表生成公示表
    农经权确权过程中要收集很多信息,最重要的信息为每户有多少块地,这户又有多少人来着。在村里公示的时候,不仅要有图纸公示位置,而且要有对应的表格看公示信息。然而存在一个问题,一户的地块数跟家庭成员数量不会有对应关系,用excel表格处理,没法做到将地块表与家庭成员表结合到一块。......
  • 数据结构实验(串的实现)
    实验串的实现一、实验目的1.掌握串的基本概念;2.理解串的几种存储表示及其特点;3.掌握串的常用操作的实现。二、实验环境硬件:计算机一台;软件:VisualStudio。三、实验内容串分别采用顺序存储方式的前提下,完成如下两个任务:1.串比较操作:编写一个比较串s和串t两个串是否相......