【Leetcode】top 100 矩阵

73 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

方法一:拷贝出一个同样大小的矩阵,根据拷贝矩阵在原矩阵上修改元素;   空间复杂度O(mn)

方法二:第一次遍历用row记录第几行需要被改变,用column记录第几列需要被改变;第二次遍历再修改,若当前行需要被改变,直接全置零,若当前行不需要被改变,再改变当前行中被列上的0影响的元素;    空间复杂度O(m+n),时间复杂度O(2mn)

因为第二次遍历时需要查找值,用了集合;

class Solution(object):def setZeroes(self, matrix):""":type matrix: List[List[int]]:rtype: None Do not return anything, modify matrix in-place instead."""row, column = set(), set()m, n = len(matrix), len(matrix[0])for i in range(m):for j in range(n):if matrix[i][j] == 0:row.add(i)column.add(j)        for i in range(m):if i in row:matrix[i] = [0] * nelse:for j in column:matrix[i][j] = 0return matrix

官方思路:用第一行记录行改变情况(第一行为row),用第一列记录列改变情况(第一列为column)损失的第一行和第一列信息用变量储存;只需要记录第一行第一列是否有0即可,若有0,更新后的状态需要全0,即损失的初始状态不重要;若无0,更新后的状态只会受到该行或该列的影响,所以提前置零记录该行或该列情况不影响最终结果;     空间复杂度O(1)

class Solution(object):def setZeroes(self, matrix):""":type matrix: List[List[int]]:rtype: None Do not return anything, modify matrix in-place instead."""row, column = 1, 1m, n = len(matrix), len(matrix[0])for i in range(n):                   #第一行情况if matrix[0][i] == 0: row = 0for i in range(m):                   #第一列情况if matrix[i][0] == 0: column = 0for i in range(1,m):                 #记录需要改变的行和列for j in range(1,n):if matrix[i][j] == 0:matrix[0][j] = 0matrix[i][0] = 0for i in range(1,m):                 #根据记录修改行和列for j in range(1,n):if matrix[0][j] == 0 or matrix[i][0] == 0:matrix[i][j] = 0if row == 0:                         #更新第一行for i in range(n):matrix[0][i] = 0if column == 0:                      #更新第一列for i in range(m):matrix[i][0] = 0return matrix
54 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

分析:一定会转满min(m//2, n//2)圈,最后不剩/剩一行/剩一列/剩一个中心元素;

思路一:直接模拟

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""out = []n, m = len(matrix), len(matrix[0])up, left, down, right = 0, 0, n-1, m-1for i in range(min(m,n)//2):for j in range(left,right+1):out.append(matrix[up][j])up += 1for j in range(up,down+1):out.append(matrix[j][right])right -= 1for j in range(right,left-1,-1):out.append(matrix[down][j])down -= 1for j in range(down,up-1,-1):out.append(matrix[j][left])left += 1if min(m,n) % 2 != 0:if n > m:for j in range(up,down+1):out.append(matrix[j][right])elif n < m:for j in range(left,right+1):out.append(matrix[up][j])else:out.append(matrix[n//2][m//2])return out

思路二:循环用while true,直至指针交错(相等是允许的)才退出;

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""res = []if matrix is None: return restop,bottom,left,right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1while True:for i in range(left,right+1): #➡️res.append(matrix[top][i])top += 1 if top > bottom: breakfor i in range(top,bottom+1): #⬇️res.append(matrix[i][right])right -= 1if right < left: breakfor i in range(right,left-1,-1): #⬅️res.append(matrix[bottom][i])bottom -= 1if bottom < top: breakfor i in range(bottom,top-1,-1): #⬆️res.append(matrix[i][left])left += 1if left > right: breakreturn res

思路三利用zip和*的搭配实现行列的转换; 原第一行取完后,将列转行再倒序,就能取到原最后一列;由于倒序操作改变了原行内的相对位置,恰好满足原最后一行的倒序输出;

这是真牛!!!

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""out = []while matrix:out += matrix.pop(0)matrix = list(zip(*matrix))[::-1]   return out
48 旋转图像

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

分析:观察旋转图像发现,其实就是转置再翻转

转置:list(zip(*))     [( )( )( )]     

           list(map(list, zip(*matrix))) == list(row) for row in zip(*matrix)     [[ ][ ][ ]]

翻转:[::-1]

class Solution(object):def rotate(self, matrix):""":type matrix: List[List[int]]:rtype: None Do not return anything, modify matrix in-place instead."""matrix[:] = [row[::-1] for row in zip(*matrix)]
240 搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列;每列的元素从上到下升序排列。

分析:利用 matrix 特性减少搜索时间:

小于当前行起始值,就不可能再在后续中找到;

大于当前行终止值,该行不遍历;

在当前行的范围内,小于当前列值,后续就只能在较小的列中寻找;大于当前列值,继续遍历;

class Solution(object):def searchMatrix(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""if target < matrix[0][0] or target > matrix[-1][-1]:return Falsem, n = len(matrix), len(matrix[0])for i in range(m):if target < matrix[i][0]:return Falseelif target > matrix[i][-1]:continueelse:for j in range(n):if target < matrix[i][j]:n = jelif target == matrix[i][j]:return Trueelse:continuereturn False

官方思路:从矩阵的右上角开始Z字遍历

当目标值大于这个值,目标值就不能在当前行被找到;

当目标值小于这个值,目标值就不能在当前列被找到;

class Solution:def searchMatrix(self, matrix, target):m, n = len(matrix), len(matrix[0])i, j = m - 1, 0while i >= 0 and j < n:if matrix[i][j] == target:return Trueelif matrix[i][j] < target:j += 1else:i -= 1return False

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

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

相关文章

数据分析-Pandas的直接用Matplotlib绘图

数据分析-Pandas的直接用Matplotlib绘图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

【LeetCode热题100】23. 合并 K 个升序链表(链表)

一.题目要求 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 二.题目难度 困难 三.输入样例 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,…

在react中使用tailwindcss

安装tailwind css npm i -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9安装 CRACO 由于 Create React App 不能让您覆盖原生的 PostCSS 配置&#xff0c;所以我们还需要安装 CRACO 才能配置 Tailwind。 npm install craco/craco配置CRACO 在项目根…

【Algorithms 4】算法(第4版)学习笔记 18 - 4.4 最短路径

文章目录 前言参考目录学习笔记0&#xff1a;引入介绍1&#xff1a;APIs1.1&#xff1a;API&#xff1a;加权有向边1.2&#xff1a;Java 实现&#xff1a;加权有向边1.3&#xff1a;API&#xff1a;加权有向图1.4&#xff1a;Java 实现&#xff1a;加权有向图1.5&#xff1a;AP…

android studio设置flutter和dart的sdk配置

提示没有配置dart sdk的时候&#xff0c;其实只需要配置一下flutter的sdk就可以了&#xff0c;因为flutter的安装包里面包含了dart的sdk&#xff1a; 按照提示选中这个flutter的安装包路径就可以了&#xff1a; 并且需要开启windows的开发者开关&#xff1a;start ms-settings:…

Rancher操作手册(v2.7.5-rc1)

1.登录 访问地址&#xff1a;10.66.55.132使用账号和密码登录。初始的页面是英文版本&#xff0c;可以点击左下方改为简体中文 登录成功后可以看到现有的集群。右上角可以进行新集群的创建和导入已有集群。点击箭头所指的蓝色集群名称可以进入集群。 2.集群仪表盘 进入到集…

文字弹性跳动CSS3代码

文字弹性跳动CSS3代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 下载地址 文字弹性跳动CSS3代码

神经网络中激活函数的绘制——阶跃函数、sigmoid函数、ReLU函数

一、阶跃函数 import numpy as np import matplotlib.pylab as plt def step_function(x):return np.array(x>0)x np.arange(-5.0,5.0,0.1) y step_function(x) plt.plot(x, y) plt.ylim(-0.1, 1.1) plt.show() 二、sigmoid函数 import numpy as np import matplotlib.p…

Java多线程学习(一)

多线程学习&#xff08;二&#xff09;&#xff1a;http://t.csdnimg.cn/Q8Koc 目录 1、什么是多线程 2、如何创建多线程&#xff08;多个方法&#xff09; 方法一&#xff1a;继承Thread类创建线程 方法二&#xff1a;实现Runnable接口创建线程 方法三、实现Callable接口…

Day46-http和www基础1

Day46-http和www基础1 1. 用户访问网站基本流程2. DNS系统解析基本流程3. DNS功能4. DNS树形结构介绍5. DNS解析流程&#xff08;核心&#xff09;6. 查看生产【授权DNS】并设置解析7. dig查看实际DNS解析8. 企业要不要搭建DNS服务器&#xff1f;9. HTTP协议10. HTTP协议版本11…

Kubernetes 编排系统

Kubernetes 编排系统 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它提供了一种灵活而强大的方式来管理容器化应用程序的生命周期&#xff0c;包括自动化部署、扩展、负载均衡、故障恢复等功能…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时&#xff0c;输入参数名称搜索&#xff0c;搜出来的同名参数结果有多个&#xff0c;分布在一个表格的不同行&#xff0c;表格是动态加载的&#xff0c;需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改&#xff1f; 2、网页元素…

计算机网络 |内网穿透

其实内网穿透&#xff0c;也挺好玩的&#xff0c;如果在大学的时候&#xff0c;那个时候讲计算机网络的老师能横向延展&#xff0c;估计课也会更有趣不少&#xff0c;本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说&#xff0c;怪可惜的 回到正题&#xff0c;内网…

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会

在区块链技术的风起云涌和Web3生态的蓬勃发展中&#xff0c;知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit()&#xff0c;此次大会将为全球区块链开发者及业…

【JavaScript知识点】预解析、作用域、数据类型、数组常用方法、字符串常用方法

JS知识点 1.预解析2.作用域&#xff1a;一个变量可以生效的范围,这个变量的使用范围就是作用域3.作用域访问规则4.我们的存储空间分成两种栈和堆5.数据类型分为基本数据类型和复杂数据类型6.冒泡排序和选择排序7.数组常用方法8.字符串常用方法9.json 是一种轻量级的数据交换格式…

计算机网络——物理层(数据交换方式)

计算机网络——数据交换方式 提高数据交换方式的必要性电路交换电路交换原理电路交换的阶段建立阶段通信阶段和连接拆除阶段 电路交换的优缺点报文交换什么是报文报文交换的阶段报文交换的优缺点 分组交换分组交换的阶段分组交换的优缺点 数据交换方式的选择数据报方式数据报方…

使用vue3 开发H5 ,需要注意的部分点

以下内容为使用vue3 开发H5 中碰到的几个点&#xff0c;个人愚见。不定期进行补充。 框架端 1. 安装 vite插件 vitejs/plugin-legacy 。 npm add -D vitejs/plugin-legacy使用&#xff1a; 在vite.config.js 中引入 import legacy from vitejs/plugin-legacy; export defau…

相机拍照与摄影学基础

1.相机拍照 相机可能形状和大小不同&#xff0c;但基本功能相同&#xff0c;包括快门速度、光圈和感光度&#xff0c;这些是摄影的通用概念。即使是一次性相机也是基于这三个理念工作的。不同类型相机在这三个概念上的唯一区别是你可以控制这些功能的程度。这三个参数被称为相…

Redis在缓存方面的应用有哪些?如何避免缓存击穿、缓存雪崩等问题?Redis如何实现分布式锁?有哪些注意事项?

Redis在缓存方面的应用有哪些&#xff1f;如何避免缓存击穿、缓存雪崩等问题&#xff1f; Redis在缓存方面的应用广泛且多样&#xff0c;包括但不限于以下几个方面&#xff1a; 页面缓存&#xff1a;Redis可以将Web页面的内容片段&#xff0c;包括HTML、CSS和图片等静态数据&a…

【ESP32接入国产大模型之MiniMax】

1. MiniMax 讲解视频&#xff1a; ESP32接入语言大模型之MiniMax MM智能助理是一款由MiniMax自研的&#xff0c;没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司&#xff0c;一直致力于进行大模型相关的研究。 随着人工智能技术的不断发展&#xff0c;自然语…