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

news2024/11/12 12:16:35

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的矩阵,问题就解决了。好了,这道题就讲到这里了,祝大家刷题愉快~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达深度学习笔记:序列模型(Sequence Models) 1.1-1.2

目录 第五门课 序列模型(Sequence Models)第一周 循环序列模型&#xff08;Recurrent Neural Networks&#xff09;1.1 为什么选择序列模型&#xff1f;&#xff08;Why Sequence Models?&#xff09;1.2 数学符号&#xff08;Notation&#xff09; 第五门课 序列模型(Sequenc…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意&#xff1a;运行前需要开启服务端口 如果运行看不到效果&#xff0c;设置下基础库选别的版本 配置

Java反射、注解、泛型——针对实习面试

目录 Java反射、注解、泛型什么是反射&#xff1f;反射有什么优缺点&#xff1f;优点缺点 什么是泛型?泛型的优点泛型的实现 泛型怎么使用&#xff1f;泛型类泛型方法泛型接口类型参数命名约定泛型的类型限定泛型的通配符 什么是泛型擦除机制&#xff1f;为什么要擦除&#xf…

【SpringMVC】——Cookie和Session机制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;实践 1&#xff1a;获取URL中的参数 &#xff08;1&#xff09;PathVariable 2&…

webWorker基本用法

我们都知道js是一个单线程的语言&#xff0c;当线程堵塞时&#xff0c;可能会导致页面无法正常交互&#xff0c;如一些复杂的可视化处理。即使是异步处理&#xff0c;也只是将其暂存到任务队列中去&#xff0c;等主线程执行完后依然会从任务队列中取过去。 为此&#xff0c;js提…

一文学习Android中的Property

在 Android 系统中&#xff0c;Property 是一种全局的键值对存储系统&#xff0c;允许不同组件和进程间以轻量级的方式进行数据传递。它主要用于系统配置、状态标识等场景&#xff0c;使得不同进程能够通过属性的设置或获取来通信。property 的核心特性是快速、高效&#xff0…

使用PEFT在多个AMD GPU上进行StarCoder的指令微调

Instruction fine-tuning of StarCoder with PEFT on multiple AMD GPUs — ROCm Blogs 2024年4月16日&#xff0c;由 Douglas Jia撰写。 在这篇博客中&#xff0c;我们将向您展示如何使用指令-答案对数据集在AMD GPU上微调StarCoder基础模型&#xff0c;以便它能够根据指令生…

后台管理系统窗体程序:文章管理 > 文章列表

目录 文章列表的的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;文章表格 &#xff08;2&#xff09;删除按钮 &#xff08;3&#xff09;编辑按钮 &#xff08;4&#xff09;发表文章按钮 &#xff08;5&#xff09;所有分类下拉框 &a…

微软的新模拟器将为 Windows on Arm 带来更多游戏

微软正在测试一项重大的 Windows on Arm 更新&#xff0c;以便让更多 x64 软件和游戏在配备高通 Snapdragon X Elite 或 X Plus 处理器的 Copilot Plus PC 上的 Prism 仿真下运行。 该功能是 Windows 11 Insider Preview Build 27744 的一部分&#xff0c;已向 Canary Channel …

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。特别是在公共资源管理方面&#xff0c;视频监控的应用日益广泛&#xff0c;涵盖了智慧城市、智能交通、大型企业以及校园安防等多个领域。NVR小程序接入平台EasyNVR作为一款功…

从单层到 MVC,再到 DDD:架构演进的思考与实践

引言 在日常开发中&#xff0c;我们之前工作中经常接手的大多数都是传统 MVC 架构体系的项目。然而&#xff0c;随着现在分布式和微服务架构的普及&#xff0c;越来越多的项目开始重构、拆分&#xff0c;传统的 MVC 架构也逐渐向 DDD 架构演进。为什么需要将传统架构重构为 DD…

CDN到底是什么?

文章目录 CDN到底是什么&#xff1f;一、引言二、CDN的基本概念1、CDN的定义2、CDN的作用3、代码示例&#xff1a;配置CNAME记录 三、CDN的工作原理1、请求流程2、代码示例&#xff1a;DNS解析过程3、完整的CDN工作流程 四、总结 CDN到底是什么&#xff1f; 一、引言 在互联网…

uniapp—android原生插件开发(3Android真机调试)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 一、打包uniapp资源包&#xff1a; 打包…

嵌入式采集网关(golang版本)

为了一次编写到处运行&#xff0c;使用纯GO编写&#xff0c;排除CGO&#xff0c;解决在嵌入式中交叉编译难问题 硬件设备&#xff1a;移远EC200A-CN LTE Cat 4 无线通信模块&#xff0c;搭载openwrt操作系统&#xff0c;90M内存

IDEA中maven更新pom文件后使其生效(自动 + 手动)

pom文件更新后默认是不生效的&#xff0c;需要手动刷新maven&#xff0c;即点击Reload Project&#xff0c;注意尽量不要用最上面那个Reload all project&#xff0c;这样的话刷新会很慢&#xff0c;因为会对整个项目Reload Project 如果懒得每次手动Reload&#xff0c;那么可…

单调栈—acwing

一、题目&#xff1a; AcWing 830. 单调栈 - AcWing 暴力算法思想 双指针算法&#xff0c;本质上是比较操作&#xff0c;两个循环&#xff0c;时间复杂度高。通过栈可以一次遍历。 可以知道&#xff0c;只要前面有一个小于我的数&#xff0c;就可以。如果前面的数&#xff…

Linux内核中IRQ Domain的结构、操作及映射机制详解

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现 pinctrl和gpio子系统专栏&#xff1a; 专栏地址&#xff1a;pinctrl和gpio子系统 编写虚拟的GPIO控制器的驱动程序&#xff1a;…

C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

文章目录 一.继承的概念及定义1.1继承的概念1.2继承类1.2.1继承方法 1.3继承模板 二.基类和派生类的转换三.继承中的作用域四.派生类的默认成员函数4.1默认成员函数的行为4.2实现一个无法被继承的类 五.继承与友元六.继承与静态成员七.多继承和菱形继承7.1多继承和菱形继承7.2虚…

无人车之编队控制算法篇

一、编队控制算法概述 无人车编队控制算法旨在实现多辆无人车之间的协同行驶&#xff0c;保持预定的队形和间距&#xff0c;以应对各种复杂环境和任务需求。该算法通常包括队形生成、队形保持、队形变换和编队模式切换等关键步骤。 二、编队控制算法的核心要素 队形生成&…

【大数据学习 | kafka高级部分】kafka的数据同步和数据均衡

1. 数据同步 通过上图我们发现每个分区的数据都不一样&#xff0c;但是三个分区对外的数据却是一致的 这个时候如果第二个副本宕机了 但是如果是leader副本宕机了会发生什么呢&#xff1f; 2. 数据均衡 在线上程序运行的时候&#xff0c;有的时候因为上面副本的损坏&#xff…