【力扣hot100】刷题笔记Day7

news2024/12/23 22:26:38

前言

  • 身边同学已经陆陆续续回来啦,舍友都开始投简历了,我也要加油啦!刷完hot100就投!

73. 矩阵置零 - 力扣(LeetCode)

  • 标记数组:空间复杂度O(m+n)

    • class Solution:
          def setZeroes(self, matrix: List[List[int]]) -> None:
              m, n = len(matrix), len(matrix[0])
              row, col = [False] * m, [False] * n  # 标记数组
              # 遍历一次,标记对应的行列为0
              for i in range(m):
                  for j in range(n):
                      if matrix[i][j] == 0:
                          row[i] = col[j] = True
              # 遍历二次,根据标记修改对应行列
              for i in range(m):
                  for j in range(n):
                      if row[i] or col[j]:
                          matrix[i][j] = 0
  • 两个标记变量:空间复杂度O(1)

    • 思路参考题解,遇到0就向首行首列汇报,最后再把首行首列置0
    • class Solution:
          def setZeroes(self, matrix: List[List[int]]) -> None:
              m, n = len(matrix), len(matrix[0])
              # 如果可迭代对象中有任何一个元素为 True,则 any 函数返回 True;否则返回 False
              flag_col0 = any(matrix[i][0] == 0 for i in range(m))  # 判断首行是否有0
              flag_row0 = any(matrix[0][j] == 0 for j in range(n))  # 判读首列是否有0
              # 迭代非首行非首列,遇到0就把置0指令放在首行首列
              for i in range(1, m):
                  for j in range(1, n):
                      if matrix[i][j] == 0:
                          matrix[i][0] = matrix[0][j] = 0
              # 迭代非首行非首列,根据指令置0
              for i in range(1, m):
                  for j in range(1, n):
                      if matrix[i][0] == 0 or matrix[0][j] == 0:
                          matrix[i][j] = 0
              # 首行有0,则全置0
              if flag_col0:
                  for i in range(m):
                      matrix[i][0] = 0
              # 首列有0,则全置0
              if flag_row0:
                  for j in range(n):
                      matrix[0][j] = 0
  • 一个标记变量:空间复杂度O(1)

    • 参考题解,保存首行,但是要全部倒序遍历,防止提前更新,太难想仅作参考
    • class Solution:
          def setZeroes(self, matrix: List[List[int]]) -> None:
              m = len(matrix)
              n = len(matrix[0])
              first_row = False   # 标记首行是否有0元素
              for i, row in enumerate(matrix):
                  for j, item in enumerate(row):
                      if i == 0 and item == 0:
                          first_row = True    # 首行出现0元素,用标志位标记
                      elif item == 0:
                          matrix[i][0] = 0    # 非首行出现0元素,将对应的列首置为0,说明该列要置为0
                          matrix[0][j] = 0    # 将对应的行首置为0,说明该行要置为0
              for i in range(m - 1, -1, -1):
                  for j in range(n - 1, -1, -1):
                      # 从最后一个元素反向遍历,避免行首和列首的信息被篡改
                      if i == 0 and first_row:
                          matrix[i][j] = 0    # 首行元素是否置为0看标志位
                      elif i != 0 and (matrix[i][0] == 0 or matrix[0][j] == 0):
                          matrix[i][j] = 0    # 非首行元素是否置为0看行首和列首是否为0

54. 螺旋矩阵 - 力扣(LeetCode)

  • 边界模拟

    • 类似之前C++版本,设置边界,依次循环模拟输出,边界溢出则跳出循环
    • class Solution:
          def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
              res = []
              l, r, u, d = 0, len(matrix[0])-1, 0, len(matrix)-1
              while True:
                  # 向右
                  for i in range(l, r+1): res.append(matrix[u][i])
                  u += 1
                  if u > d: break
                  # 向下
                  for i in range(u, d+1): res.append(matrix[i][r])
                  r -= 1
                  if r < l: break
                  # 向左
                  for i in range(r, l-1, -1): res.append(matrix[d][i])
                  d -= 1
                  if d < u: break
                  # 向上
                  for i in range(d, u-1, -1): res.append(matrix[i][l])
                  l += 1
                  if l > r: break
              return res

 48. 旋转图像 - 力扣(LeetCode)

  • 辅助数组

    • class Solution:
          def rotate(self, matrix: List[List[int]]) -> None:
              n = len(matrix)
              matrix_new = [[0] * n for _ in range(n)]  # 新的n*n的矩阵
              for i in range(n):
                  for j in range(n):
                      # matrix[row][col]旋转到matrix_new[col][n−row−1]
                      matrix_new[j][n-i-1] = matrix[i][j]
              # 不能写成 matrix = matrix_new
              matrix[:] = matrix_new
  •  原地旋转

    • class Solution:
          def rotate(self, matrix: List[List[int]]) -> None:
              n = len(matrix)
              for i in range(n // 2):  # 偶数n/2,奇数(n-1)/2
                  for j in range((n + 1) // 2):  # 偶数n/2,奇数(n+1)/2
                      matrix[i][j], matrix[n-j-1][i], matrix[n-i-1][n-j-1], matrix[j][n-i-1] \
                      = matrix[n-j-1][i], matrix[n-i-1][n-j-1], matrix[j][n-i-1], matrix[i][j]
  •  两次翻转

    • class Solution:
          def rotate(self, matrix: List[List[int]]) -> None:
              n = len(matrix)
              # 上下翻转:只遍历上半部
              for i in range(n // 2):
                  for j in range(n):
                      matrix[i][j], matrix[n-i-1][j] = matrix[n-i-1][j], matrix[i][j]
              # 对角翻转:只遍历下三角
              for i in range(n):
                  for j in range(i):
                      matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

 240. 搜索二维矩阵 II - 力扣(LeetCode)

  • 直接搜索:N(mn)

    • 就不用传统的遍历写法了,这里记录两种仅用一行就可以实现的搜索算法
    • class Solution:
          def searchMatrix(self, M: List[List[int]], target: int) -> bool:
          # chain()函数于将多个可迭代对象连接成一个单独的迭代器
          # 这里用于连接多个被*M解包得到的多个一维列表   
          return target in chain(*M)
          # 直接利用sum函数转化为一个一维列表
          return target in sum(M,[])
  • 二分查找:N(log(mn))

    • class Solution:
          def searchMatrix(self, M: List[List[int]], target: int) -> bool:
              def bin_search(arr,target):
                  l,r = 0,len(arr)-1
                  while l <= r:
                      mid = (l+r) // 2
                      if arr[mid] == target:
                          return True
                      elif arr[mid] < target:
                          l = mid + 1
                      else:
                          r = mid - 1
                  return False
              m = len(M)
              # 逐行进行二分查找
              for i in range(m):
                  if bin_search(M[i], target):
                      return True
              return False
  • 贪心BST

    • 也叫折线搜索,来源于题解,图画的很清晰,从右上角出发进行搜索
    • class Solution:
          def searchMatrix(self, M: List[List[int]], target: int) -> bool:
              i, j = len(M) - 1, 0
              # 右上角出发进行搜索
              while i >= 0 and j <= len(M[0]) - 1:
                  if target > M[i][j]:
                      j += 1  # 往下移,排除一行
                  elif target < M[i][j]:
                      i -= 1  # 往左移,排除一列
                  else:
                      return True
              return False

 后言

  • 一题多解的还是尽量每个解都弄懂,前期基础打好点,后面能快速写出最简单的就好啦

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

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

相关文章

LeetCode--代码详解 59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&a…

【Effective Objective - C】—— 系统框架

【Effective Objective - C】—— 系统框架 47.熟悉系统框架CoreFoundation框架其他框架要点 48. 多用块枚举&#xff0c;少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点 49.对自定义其内存管理语义的collection使用无缝桥接要点 50.构…

利用MATLAB/Simulink仿真模型加速嵌入式控制系统的开发——以多学科融合的电机控制为例

电机控制涵盖了广泛的应用领域&#xff0c;从家用电器到工业设备&#xff0c;从电动汽车到航空航天&#xff0c;其重要性不言而喻。从过去到现在&#xff0c;再到未来&#xff0c;电机控制技术的发展经历了显著的变革&#xff0c;并持续推动着相关行业的进步。 一、电机控制的…

pip镜像源:清华镜像、阿里云镜像、豆瓣镜像与如何修改默认镜像源

pip镜像源&#xff1a;清华镜像、阿里云镜像、豆瓣镜像与如何修改默认镜像源 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;【Matplotlib之旅&#xff1a;零基础精通数据可视化】 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取…

git clone 克隆代码报错

在拉取代码的时候报这个错误&#xff0c;也看了一下地址是正确的的&#xff0c;网络也正常。然后ping gitlab.com执行也没问题&#xff0c;如果有问题就是是环境问题。我以为是git名字和邮箱没有绑定的原因&#xff0c;结果绑定了还是这个问题&#xff0c;这个时候就只好百度啦…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(六)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

数据结构---字典树(Tire)

字典树是一种能够快速插入和查询字符串的多叉树结构&#xff0c;节点的编号各不相同&#xff0c;根节点编号为0 Trie树&#xff0c;即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。 核心思想也是通过空间来换取时间上的…

Elastic Stack--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Elastic Stack 简介为什么要学习ESDB-Engines搜索引擎类数据库排名常年霸榜![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/051342a83f574c8c910cda522…

YOLOv8改进 | 进阶实战篇 | 利用辅助超推理算法SAHI推理让小目标无所谓遁形(支持视频和图片)

欢迎大家订阅我的专栏一起学习YOLO! 一、本文介绍 本文给大家带来的是进阶实战篇,利用辅助超推理算法SAHI进行推理,同时官方提供的版本中支持视频,我将其进行改造后不仅支持视频同时支持图片的推理方式,SAHI主要的推理场景是针对于小目标检测(检测物体较大的不适用,…

WMS仓储管理系统解决方案如何释放智能仓库的潜力

随着科技的不断进步与创新&#xff0c;智能化仓储设备正逐渐成为企业转型升级的必备利器。越来越多的企业纷纷投入巨资&#xff0c;打造智能仓库&#xff0c;以应对激烈的市场竞争。与传统仓库相比&#xff0c;智能仓库凭借其高效、准确、自动化的特点&#xff0c;成为了企业提…

在springboot项目中调用openai API及我遇到的问题

这两天我在自己的网站中集成了openai API&#xff0c;引入chatgpt对话机器人&#xff0c;中途遇到了很多坑&#xff0c;记录一下。文章中会涉及一些付费工具&#xff0c;如果你有类似功能的工具&#xff0c;完全可以使用自己的。&#xff08;主要是我想澄清一下&#xff0c;我不…

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6相比LPDDR5在ZQ校准这一块删除了command-based相关的描述&#xff0c;删除了ZQ校准模式切换的描述&#xff0c;仅支持background-based的校准。 回顾一下LPDDR5 基于background-based的校准&#xff1a; background ZQC是通过MR28 OP[5]来选择的&#xff0c;当选择为0&a…

一个基于C#开发的、开源的特殊字符输入法

emoji表情在社交网络非常流行&#xff0c;我们在手机也非常方便输入&#xff0c;但是在PC电脑我们一般需要到归集好的网页拷贝&#xff0c;所以今天推荐一个Windows小工具&#xff0c;让你方便输入特殊字符和emoji表情。 01 项目简介 这是一个基于C#开发的开源项目&#xff0…

解锁动态体验:探秘文件二维码生成的多重魅力

文件生成二维码&#xff0c;作为一种动态二维码&#xff0c;不仅能够存储丰富的信息&#xff0c;更通过其独特的特点为用户带来了全新的使用体验。让我们一起深入探讨这一引人注目的技术。 1. 数据追踪&#xff1a;揭示用户互动的面纱 在二维彩虹的文件二维码中&#xff0c;数…

使用 Next.js 连接 mysql 数据库

前言 本文主要为大家介绍&#xff0c;如何使用 Next 框架实现一个简单的后端接口&#xff0c;并且从数据库中请求数据返回给前端。 实现 创建api/getData文件夹 项目创建完成后在 app 文件下新建api文件夹&#xff0c;在 api 文件夹下新建 getData 文件夹&#xff0c;在 ge…

聊一聊bpmn-js中的Viewer和Modeler

通过之前对于bpmn-js的学习,可以完成一个基础的Bpmn编辑器(或者叫建模器)的显示和简单绘制,若需要做更多工作还需加强对其的内部实现的了解。通过使用我们可以知道bpmn-js中有两个比较重要的操作对象:bpmnViewer和bpmnModeler。 Viewer:一般习惯性对齐命名对象称之为bpmnVi…

golang入门介绍-1

今天开始发布关于go语言入门到实战内容&#xff0c;各位小伙伴准备好。 go介绍 Go语言&#xff08;或 Golang&#xff09;起源于 2007 年&#xff0c;并在 2009 年正式对外发布。是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 Go 是…

在哪些领域中最需要使用 OCR 识别技术?真实场景介绍

根据我们的项目经验总结来说&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术在多个领域中扮演着至关重要的角色&#xff0c;它能够将图像中的文本内容转换为机器可读的格式&#xff0c;极大地提高了数据处理的效率和准确性。以下是一些主要领域及其对应的应用场景和用…

phar反序列化原理及利用

phar是什么&#xff1f; phar 是 PHP 的一种归档文件格式&#xff0c;类似于 ZIP 或 TAR 文件&#xff0c;它可以包含多个文件和目录&#xff0c;并且可以像访问普通文件系统一样在 PHP 中进行访问。在php 5.3 或更高版本中默认开启 在php.ini中配置如下时&#xff0c;才能生成…

LabVIEW压电驱动迟滞补偿控制

LabVIEW压电驱动迟滞补偿控制 随着精密控制技术的迅速发展&#xff0c;压电陶瓷驱动器因其高精度和快速响应特性&#xff0c;在微纳精密定位系统中得到了广泛应用。然而&#xff0c;压电材料固有的迟滞非线性特性严重影响了其定位精度和重复性。开发了一种基于LabVIEWFPGA的压…