LeetCode 热题 100 Day06

矩阵相关题型

Leetcode 48. 旋转图像【中等】

题意理解:

        将一个矩阵顺时针旋转90度,返回旋转后的矩阵。        

        要求: 在原地修改,不借助额外的空间

        如果可以使用辅助数组来实现转置,则有

        matrix_new[i][j]=matrix[j][row-i-1];

解题思路:

       (1) 四数循环:

        将其一层一层的进行转置

        首先看最外面的一层,将其分为红色方框中的四部分

        从第一个红色方框开始: 第一个位置(0,0)将转置到(0,2)的位置上

        原本(0,2)的位置上的数转置到(2,2),

        原来(2,2)上的数转置到(2,0)

        原来(2,0)的位置转置到(0,0)

        即: (0,0)->(0,2)->(2,2)->(2,0)->(0,2)->(0,0)

        坐标变化为: (i,j)->(j,row-i-1) 变换四次

        完成一个红色框的所有元素的变换,则完成了一层数据的转置

        如何进入下一层呢?

        i++,j++即可,重复上述操作。

        何时跳出循环:

        当且仅当,i,j指向中心元素时,跳出循环,如下图中: i=3/2=1 时,走到矩阵核心,不需要继续转置

      

        

        能不能理解更简单一些呢?

        对于四数循环的while可以从循环中展开:即实现四数互换

        

        思路二:反转替代转置

       顺时针转置90度=水平+对角线

        水平翻转: new_i,new_j=row-i-1,j

        对角线反转: new_i,new_j=j,i

1.解题【四数循环】

class Solution {public void rotate(int[][] matrix) {//使用坐标变换的逻辑,实现旋转int row=matrix.length,col=matrix[0].length;int cur_i=0,cur_j=0;int curVal=matrix[cur_i][cur_j];while(cur_i!=row/2){for(int j=cur_i;j<row-cur_i-1;j++){cur_j=j;curVal=matrix[cur_i][cur_j];int count=4;while(count-->0){int next_i=cur_j;int next_j=row-cur_i-1;int nextVal=matrix[next_i][next_j];matrix[next_i][next_j]=curVal;cur_i=next_i;cur_j=next_j;curVal=nextVal;}}cur_i++;}}
}

改进:可以将四数循环的while展开写:

class Solution {public void rotate(int[][] matrix) {//使用坐标变换的逻辑,实现旋转int row=matrix.length,col=matrix[0].length;int cur_i=0;while(cur_i!=row/2){for(int cur_j=cur_i;cur_j<row-cur_i-1;cur_j++){int temp=matrix[cur_i][cur_j];matrix[cur_i][cur_j]=matrix[row-cur_j-1][cur_i];matrix[row-cur_j-1][cur_i]=matrix[row-cur_i-1][row-cur_j-1];matrix[row-cur_i-1][row-cur_j-1]=matrix[cur_j][row-cur_i-1];matrix[cur_j][row-cur_i-1]=temp;System.out.println( matrix[cur_i][cur_j]+" "+matrix[row-cur_i-1][cur_j]+" "+matrix[row-cur_i-1][row-cur_j-1]+" "+matrix[cur_i][row-cur_j-1]);}cur_i++;}}
}

1.翻转替代转置【水平翻转+对角线翻转】

class Solution {public void rotate(int[][] matrix) {//使用坐标变换的逻辑,实现旋转int row=matrix.length,col=matrix[0].length;//水平翻转for(int i=0;i<row/2;i++){for(int j=0;j<col;j++){int temp=matrix[i][j];matrix[i][j]=matrix[row-i-1][j];matrix[row-i-1][j]=temp;}}//对角线翻转for(int i=0;i<row;i++){for(int j=0;j<i;j++){int temp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}}
}

2.复杂度分析

时间复杂度:O(n^2) while(n/2)+for循环+4次while循环的时间损耗

空间复杂度:O(1)  原地转置的空间损耗

Leetcode 240. 搜索二维矩阵 II【中等】

题意理解:

        这个矩阵是有顺序的,左到右升序,上到下升序

        要求找到执行的元素,找到为true,否则为false

解题思路:

       1.逐个对比:双for循环

       2.由于每行都是升序,可以对于每行进行二分排序

       3.对角线查找:每行都是顺序升序的,每列也是升序的

                从右上角到左下角,比当前值大往左,比当前值小往下

                上下维度控制变大,左右维度控制变小

1.解题【双for循环】

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row=matrix.length,col=matrix[0].length;for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(matrix[i][j]==target) return true;}}return false;}
}

1.解题:【遍历行二分查】

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row=matrix.length,col=matrix[0].length;for(int i=0;i<row;i++){//对每行进行二分查找int low=0,high=col-1;while(low<=high){int mid=(high-low)/2+low;int midNum=matrix[i][mid];if(midNum==target) return true;else if(midNum>target){high=mid-1;}else{low=mid+1;}}}return false;}
}

1.解题:【对角线查找】

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row=matrix.length,col=matrix[0].length;int i=0,j=col-1;//从右上角往左下角找,==返回>往左,<往下while(x<row&&y>=0){if(matrix[i][j]==target){return true;}else if(matrix[i][j]>target){j--;}else if(matrix[i][j]<target){i++;}}return false;}
}

2.复杂度分析

思路一:

时间复杂度:O(n^2) 双for的时间损耗

空间复杂度:O(1) 变量的空间损耗

思路二:

时间复杂度:O(nlogn) for+二分的时间损耗

空间复杂度:O(1) 变量的空间损耗

思路一:

时间复杂度:O(n) 双for的时间损耗

空间复杂度:O(1) 变量的空间损耗

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

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

相关文章

Kubernetes学习-核心概念篇(三) 核心概念和专业术语

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 1. 前言 在前面两篇文章我们简单介绍了什么是K8S&#xff0c;以及K8S的…

mysql服务器无法启动问题处理

一台hlr服务器用网管软件登录失败&#xff0c;查找原因&#xff0c;发现网关软件连接服务器的tcp的10002端口失败&#xff0c;超时无应答&#xff0c;导致连接失败。 用户反馈核心网hlr&#xff0c;smc无法登录&#xff0c;putty登录服务器&#xff0c;发现hlr10002端口没有打…

【保姆级讲解下gateway基本配置】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

STM32与OLED显示屏通信(四针脚和七阵脚)

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 单片机调试 2. OLED简介 3. 接线 4. OLED驱动函数 4.1 四针脚版本 OLED.c OLED.h OLED_Font.h 4.2 七针脚版本 引脚连接 OLED.c OLED.h OLED_Font.h 5. 主函数 工程文件模板 1. 单片机…

Android 当存在双卡时,移动网络默认为SIM卡1

文章目录 一、当Android设备中存在双卡时&#xff0c;移动网络默认为SIM卡1二、下面是完整的代码路径和修改点 一、当Android设备中存在双卡时&#xff0c;移动网络默认为SIM卡1 完成这个需求有以下两个修改点&#xff1a; 下面依旧是Android13 MTK平台&#xff0c;在MtkMulti…

SoC如何开机自动运行脚本程序?

目录 1、通过启动加载程序执行脚本 2、通过Linux init 系统 2.1、/etc/init.d目录中的脚本 2.2、修改/etc/rc.local文件 在Linux SoC开发中&#xff0c;实现SoC启动时执行特定脚本的方法主要取决于你使用的启动加载程序&#xff08;Bootloader&#xff09;以及Linux内核的配置。…

unity中压缩文件与解压文件

今天研究了一下在unity中 把文件压缩后转二进制发送到服务器并从服务器下载后解压使用文件&#xff0c;废话不多说直接上代码&#xff0c;zip压缩插件是用的dotnetzip插件&#xff0c;网上可以搜索下载这个dll private static void GetPathMeshData_ZIP(Milling_ProjectData da…

(Snowflake Algorithm)雪花算法Java的简单使用

概述 雪花算法&#xff08;Snowflake Algorithm&#xff09;最初是由Twitter开源的&#xff0c;用于生成一个64位的长整型数字作为全局唯一的ID。这个算法是用Scala语言编写的&#xff0c;并且在Twitter内部得到了广泛应用。由于其简单、高效和分布式友好的特性&#xff0c;雪…

Fiddlers使用

下载 FiddlerClassic&#xff0c;是免费的&#xff0c;不过只能在Windows上使用。 使用 如何使用Fiddler进行手机端抓包 手机抓包&#xff0c;如果使用有线WindowsPC共享Wifi热点&#xff0c;子网络ip地址段与PC不一致&#xff0c;再添PC ip地址&#xff08;8888&#xff09…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端&#xff0c;输入sh jmeter 出现jmeter首页界面&#xff0c;即为成功。 5、使用 5.1 语言选择 option选项卡&am…

揭秘!七大副业赚钱秘籍,让你轻松实现财务自由!

以下是七种赚钱的副业推荐&#xff1a; 1&#xff0c;自媒体运营 自媒体运营是当下非常火热的副业之一。通过在微博、微信公众号、抖音、B站等自媒体平台上发布原创内容&#xff0c;吸引粉丝关注&#xff0c;进而实现流量变现。自媒体运营的核心在于内容创作和粉丝互动&#…

java解析PDF、WORD获取其中的表格以及文本内容

近期因工作需要需要解析PDF&#xff0c;需要把PDF中的文本和表格分离&#xff0c;最终要实现的目标是PDF中的文本内容放一块&#xff0c;表格内容放一块&#xff0c;以list的形式存储。解析PDF的技术有很多&#xff0c;经过多次尝试发现使用AdobeAcrobat可以实现表格和文本分离…

06 华三防火墙的如何进入web页面?

1 AI 思路 要进入华三防火墙的Web页面,你需要按照以下步骤操作: 确定防火墙的IP地址:首先,你需要知道你的华三防火墙的IP地址。通常,你可以从网络管理员或者设备本身获取这个信息。 打开浏览器:在你的电脑上打开一个网页浏览器,例如Chrome、Firefox或者Edge等。 输入UR…

系统服务(22年国赛)—— DHCPDHCP Relay(中继)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 系统服务&#xff08;22年国赛&#xff09;—— DHCP&&DHCP Relay(中继)https://myweb.myskillstree.cn/94.html 目录 一、题目 DHCP AppSrv 二…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

第 4 篇 : Netty客户端互发图片和音/视频

说明 因为图片和音/视频不能确定其具体大小, 故引入MinIO。客户端之间只发送消息, 通过上传/下载来获取额外信息 1. MinIO搭建(参考前面文章), 并启动 2. 登录MinIO创建3个Bucket: image、voice、video 3. 客户端改造 3.1 修改 pom.xml <?xml version"1.0" …

苍穹外卖绕过微信支付

经过以下改动可实现&#xff1a; 1、不用微信支付端口 2、弹出支付成功的界面 3、数据库修改支付成功后的数据 #在OrderServiceImpl.java里加入Autowiredprivate OrderService orderService; #在OrderServiceImpl.java里的payment函数做以下改动 #图片里有&#xff0c;红色为原…

2024李卜常识王小晨申论类比刷题课

2024年&#xff0c;李卜常识与王小晨申论类比刷题课成为备考公务员考试的热门选择。李卜老师以其深厚的学识&#xff0c;为学员们剖析常识的精髓&#xff1b;而王小晨老师则通过类比刷题的方式&#xff0c;帮助学员们掌握申论的技巧。这两门课程相互补充&#xff0c;让学员们在…

构造 v-for 循环时 :key 和 v-bind:key 的区别

问题&#xff1a; 构造 v-for 循环时 :key 和 v-bind:key 的区别&#xff1a; 分析&#xff1a; 构造 v-for 循环时 :key 和 v-bind:key 的区别&#xff1a; 示例如下所示&#xff1a; 1、:key <my-component v-for"item in items" :key"item.id">…

03-JAVA设计模式-观察者模式

观察者模式 什么是观察者模式 Java中的观察者模式是一种常见的设计模式&#xff0c;它允许对象&#xff08;观察者&#xff09;订阅另一个对象&#xff08;被观察者&#xff09;的状态变化&#xff0c;并在状态变化时自动得到通知。 核心&#xff1a; 观察者模式主要用于1&a…