leetcode-第247场周赛-5798循环轮转矩阵(模拟题)

2023-10-31

5798. 循环轮转矩阵(模拟题)

题目链接:https://leetcode-cn.com/problems/cyclically-rotating-a-grid/

题目:

给你一个大小为 m x n 的整数矩阵 grid​​​ ,其中 m 和 n 都是 偶数 ;另给你一个整数 k 。矩阵由若干层组成,如下图所示,每种颜色代表一层:
在这里插入图片描述
矩阵的循环轮转是通过分别循环轮转矩阵中的每一层完成的。在对某一层进行一次循环旋转操作时,层中的每一个元素将会取代其 逆时针 方向的相邻元素。轮转示例如下:
在这里插入图片描述
返回执行 k 次循环轮转操作后的矩阵。


示例 1:

在这里插入图片描述

输入: grid = [[40,10],[30,20]], k = 1
输出: [[10,20],[40,30]]
解释: 上图展示了矩阵在执行循环轮转操作时每一步的状态。

示例 2:

在这里插入图片描述

输入: grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], k = 2
输出: [[3,4,8,12],[2,11,10,16],[1,7,6,15],[5,9,13,14]]
解释: 上图展示了矩阵在执行循环轮转操作时每一步的状态。

注意:

  • m == grid.length
  • n == grid[i].length
  • 2 <= m, n <= 50
  • m 和 n 都是 偶数
  • 1 <= grid[i][j] <= 5000
  • 1 <= k <= 1 0 9 10^9 109

解题思路:

题意很清晰,沿着矩阵边缘绕一圈,一层又一层,就跟削苹果似的,分层效果如下图:
在这里插入图片描述

我们令n、m为矩阵的高和宽,那么我们沿着矩阵边缘能够分成多少层呢?经过简单的计算,我们就会知道
层 数 为 : m i n ( n , m ) / 2 层数为:min(n,m)/2 minn,m/2
题目是要让我们对每一层都进行逆时针移动k步,问我们移动k步之后矩阵是什么样子的。

观察k的取值范围,我们会发现是很大的,高达 1 0 9 10^9 109。移动 1 0 9 10^9 109步的时间复杂度是很高的,我们有什么办法能够降低时间复杂度呢?
假 如 我 们 的 这 一 层 长 度 为 l , 需 要 逆 时 针 移 动 k 步 。 那 么 我 们 发 现 移 动 l % k 和 移 动 l 步 是 等 价 的 假如我们的这一层长度为l,需要逆时针移动k步。那么我们发现移动l\%k和移动l 步是等价的 l,kl%kl

那么我们只需要求这一层的长度 l l l,移动 l % k l\%k l%k步就可以了。我们假设 l e f t 、 r i g h t 、 t o p 、 b o t t o m left、right、top、bottom leftrighttopbottom分别对应的是这一层的左边界、右边界、上边界、下边界,那么 l l l
l = ( b o t t o m − t o p + 1 ) ∗ 2 + ( r i g h t − l e f t − 1 ) ∗ 2 l=(bottom-top+1)*2+(right-left-1)*2 l=(bottomtop+1)2+(rightleft1)2
在这里插入图片描述

接下来我们就需要模拟逆时针先移动一步。核心代码如下:

				for(int i=bottom;i>top;i--)
                grid[i][left]=grid[i-1][left]; //left
                grid[top][left]=top_left;

                for(int j=right;j>left+1;j--)
                grid[bottom][j]=grid[bottom][j-1]; // bottom
                grid[bottom][left+1]=bottom_left;

                for(int i=top;i<bottom-1;i++) //right
                grid[i][right]=grid[i+1][right];
                grid[bottom-1][right]=bottom_right;

                for(int j=left+1;j<right-1;j++)//top
                grid[top][j]=grid[top][j+1];
                grid[top][right-1]=top_right;

leetcode AC代码

class Solution {
public:
    vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) {
        int n,m;
        n=grid.size();
        m=grid[0].size();
        int top,bottom,left,right,sum,t;
        int bottom_left,bottom_right,top_left,top_right;
        
        for(int ii=0;ii<min(n,m)/2;ii++)
        {
            top=ii;
            bottom=n-1-ii;
            left=ii;
            right=m-1-ii;

            sum=(bottom-top+1)*2+(right-left-1)*2;
            /*if(sum==0)
            {
                vector<int>in;
                in.push_back(1);
                in.push_back(1);
                in.push_back(1);
                vector<vector<int>> out;
                out.push_back(in);
                return out;
            }*/
            t=k%sum;

            while(t--)
            {
                top_left=grid[top][left+1]; 
                bottom_left=grid[bottom][left];
                bottom_right=grid[bottom][right];
                top_right=grid[top][right];

                for(int i=bottom;i>top;i--)
                grid[i][left]=grid[i-1][left]; //left
                grid[top][left]=top_left;

                for(int j=right;j>left+1;j--)
                grid[bottom][j]=grid[bottom][j-1]; // bottom
                grid[bottom][left+1]=bottom_left;

                for(int i=top;i<bottom-1;i++) //right
                grid[i][right]=grid[i+1][right];
                //grid[top][right-1]=top_right;
                grid[bottom-1][right]=bottom_right;

                for(int j=left+1;j<right-1;j++)//top
                grid[top][j]=grid[top][j+1];
                grid[top][right-1]=top_right;

            }
        }

        return grid;
    }
};

最后感谢小伙伴们的学习噢~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode-第247场周赛-5798循环轮转矩阵(模拟题) 的相关文章

  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 根据拦截和返回值自动重试客户端WCF调用

    是否可以拦截 WCF 调用的结果并重试该操作 例如 操作的返回值可能包含状态代码 指示我传递到原始调用的会话令牌已过期 在这种情况下 我可以检索新的会话令牌并使用新的会话令牌重试调用 是否可以通过使用 WCF 拦截返回值 检查它 然后以对操
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015

随机推荐

  • LaTex 使用特殊章节符号 (§)

    参考 LaTex 使用特殊章节符号 LaTex 使用特殊章节符号 在 tex文件开头 加上以下内容 usepackage utf8 inputenc usepackage cleveref crefname section Crefname
  • Android动画进阶指北

    原文链接 Android Animation Advanced Tricks 前面的文章介绍了动画的基本使用方法 本文来聊一聊涉及到动画的高级技巧 以及一些非常优质的学习资源和动画三方库和框架 页面之间的过渡动画 常规的动画都是针对某一页面
  • java配置文件中数据库密码加密

    最近 有位读者私信我说 他们公司的项目中配置的数据库密码没有加密 编译打包后的项目被人反编译了 从项目中成功获取到数据库的账号和密码 进一步登录数据库获取了相关的数据 并对数据库进行了破坏 虽然这次事故影响的范围不大 但是这足以说明很多公司
  • VScode使用pip已经下载了faker,但还是报错ModuleNotFoundError: No module named ‘faker‘

    修复一下pip python m ensurepip pip install faker 但是在安装faker的时候 出现了这样的情况 提示warning 换一种写法 pip install faker i http pypi douban
  • 给定一个介于0和1之间的实数,类型为double,打印它的二进制表示

    给定一个介于0和1之间的实数 0 625 类型为double 打印它的二进制表示 如果该数字无法精准地用32位以内的二进制表示 则打印 ERROR 先上代码 public class printbinary public static vo
  • ABAP DOI 技术

    用户提出的报表 是用EXCLE显示的 有许多特殊格式 比如 加粗 大小字体等 普通的ALV报表输出并不能满足用户的要求 那么只能用ALV与EXCLE的集成技术 目前已知的技术有两种 一种是OLE技术 用SMW0上传模板 然后填写数据 多数用
  • Springboot的pom.xml需要用到的依赖总结:

  • 蜣螂优化(DBO)算法(含MATLAB代码)

    先做一个声明 文章是由我的个人公众号中的推送直接复制粘贴而来 因此对智能优化算法感兴趣的朋友 可关注我的个人公众号 启发式算法讨论 我会不定期在公众号里分享不同的智能优化算法 经典的 或者是近几年提出的新型智能优化算法 并附MATLAB代码
  • python怎么生成词云图

    词云图是什么 词云图又称文字云 是信息可视化的表现形式之一 词云是把文本中出现频率较高的关键词进行视觉上的突出显示 形成关键词云层或关键词渲染 从而过滤掉大量的文本信息 读者可以快速领略文本的主旨 相对柱状图 折线图 饼图等用来显示数据的图
  • log4j2 JNDI注入漏洞问题复现

    最近大家应该都有被log4j2的JNDI注入漏洞搞的心烦意乱 当程序将用户输入的数据进行日志输出时 即可触发此漏洞 成功利用此漏洞可以在目标服务器上执行任意代码 以下为改问题的复现方法 1 首先下载JNDI Injection 起 RMI
  • 在docker里使用jupyterhub

    准备工作 需要先安装docker 具体方法参考我的上一篇文章 1 查看本地镜像docker images D go 练习 go zero demo gt docker images REPOSITORY TAG IMAGE ID CREAT
  • 程序切片知识点整理(程序依赖图、静态切片、动态切片)

    整理了很久很久的一篇文章 觉得有收获的可以点个赞点个关注哇 有问题也可以评论或找我交流 有评论必回复 目录 一 基础知识概念 关于控制流信息有如下几个基本概念 1 基本块 2 控制流图 cfg 3 有向图G 基于数据流分析的一些定义 1 到
  • SPDK/NVMe存储技术分析之SSD设备的发现(一)

    源代码及NVMe协议版本 SPDK spdk 17 07 1 DPDK dpdk 17 08 NVMe Spec 1 2 1 1 识别NVMe固态硬盘的方法 NVMe SSD是一个PCIe设备 那么怎么识别这种类型的设备 有两种方法 方法1
  • 工厂模式(分简单工厂模式、工厂方法模式、抽象工厂模式)

    1 工厂模式概述 1 1 简单工厂模式 简单工厂模式是一种创建型设计模式 它实现了创建对象的功能 但不使用任何具体类的名称 客户端通过调用工厂类的静态方法来创建一个具体的对象 无需关心对象创建的细节 1 2 工厂方法模式 工厂方法模式是一种
  • STM32 的定时器解析

    STM32有3种类型的定时器 分别是基本定时器 通用定时器和高级定时器 基本定时器有TIM6和TIM7 通用定时器有TIM2 TIM3 TIM4和TIM5 高级定时器有TIM1和TIM8 根据芯片的型号不同定时器的个数也会有所区别 本文主要
  • 《第四部分:测试用例--等价类、边界值与用例编写》

    目录 关联实例练习文档 一 认识基本术语 一 术语一 二 术语二 三 术语三 控制流图的概念 四 圈复杂度计算公式 二 用例设计 一 等价类 1 1 等价类介绍 1 2 等价类划分举例 1 3 等价类划分的设计用例思路 1 4 小结 等价类
  • JavaScript复选框的使用

    div p 请选择你的爱好 p div
  • 十行代码搞定目标检测

    大数据文摘出品 编译 邢畅 宁静 计算机视觉是人工智能的一个重要领域 是关于计算机和软件系统的科学 可以对图像和场景进行识别 理解 计算机视觉还包括图像识别 目标检测 图像生成 图像超分辨率重建等多个领域 由于存在大量的实际需求 目标检测可
  • 小技巧(5):将TT100K数据集转成VOC格式,并且用Python脚本选出45类超过100张的图片和XML

    上一篇 小技巧 4 将txt中的某两列数据写入csv文件中 制作图像分类标签 文章目录 一 相关准备 1 1 下载数据集 1 2 下载代码文件 1 3 将相关文件移入代码文件 二 创建标准的VOC文件夹 三 生成整个数据集的XML文件 四
  • leetcode-第247场周赛-5798循环轮转矩阵(模拟题)

    5798 循环轮转矩阵 模拟题 题目链接 https leetcode cn com problems cyclically rotating a grid 题目 给你一个大小为 m x n 的整数矩阵 grid 其中 m 和 n 都是 偶