【Leetcode】top 100 矩阵

news/2024/4/28 15:34:58
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.cpky.cn/p/10664.html

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

相关文章

记录工作中莫名其妙的bug

1、问题&#xff1a;办公室的电脑突然除了我之外&#xff0c;都不能访问我们的线上系统了 原因&#xff1a;因为是内网&#xff0c;同事有刚刚升级了Windows11&#xff0c;配置的DNS被清了&#xff0c;还有同事换了公司的新电脑&#xff0c;还没有配DNS 位于&#xff1a;C /Win…

python之自动化(django)

1、安装 我用的是pip install Django 在命令行中安装 然后django-admin startproject autotext&#xff08;在命令行中&#xff09; 这句话是创建一个django 项目 然后切换到你所创建项目的目录下 输入&#xff1a; python manage.py runserver 当你出现以下错误时 You…

【Python使用】python高级进阶知识md总结第4篇:静态Web服务器-命令行启动动态绑定端口号,html 的介绍【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

C语言—打印如图矩阵

输出矩阵 在一个二维数组中形成并输出如下矩阵: #include <stdio.h> main() { int i,j,a[5][5];for(i0;i<4;i)for(j0;j<4;j)if(i<j) a[i][j]1;else a[i][j]i-j1;for(i0;i<4;i){ for(j0;j<4;j)printf("%d ",a[i][j]);printf("…

redis中List和hash数据类型

list类型是用来存储多个有序的字符串的&#xff0c;列表当中的每一个字符看做一个元素&#xff0c;一个列表当中可以存储一个或者多个元素&#xff0c;redis的list支持存储2^32-1个元素。redis可以从列表的两端进行插入&#xff08;pubsh&#xff09;和弹出&#xff08;pop&…

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)

概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关&#xff0c;从而实现智能物联。NodeMCU 是基于 Lua 的开源固件&#xff0c;ESP8266-NodeMCU是一个开源硬件开发板&#xff0c;支持WiFi功能&a…