【力扣hot100】刷题笔记Day7

前言

  • 身边同学已经陆陆续续回来啦,舍友都开始投简历了,我也要加油啦!刷完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

 后言

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

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

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

相关文章

第十七届“挑战杯”广东大学生课外学术科技作品比赛感想

博主曾在2023年参加了第十七届“挑战杯”广东大学生课外学术科技作品比赛&#xff0c;也就是人们俗称的大挑&#xff0c;在团队赛里面含金量应该是排在第一档的了&#xff0c;当初我们有幸作为学校唯一一支科技创新B类进入到线下答辩&#xff0c;线下答辩就是区分银奖和金奖和特…

设计模式-创建型模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。抽象工厂模式又称为Kit模式&#xff0c;它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…

MySQL锁相关总结|悲观锁、乐观锁、读锁、写锁、表锁、行锁、页面锁、间隙锁、临键锁

MySQL锁总体结构 MySQL 的锁上可以分成三类:总体、类型、粒度。 总体上分成两种:乐观锁和悲观锁类型上也是两种:读锁和写锁锁的粒度上可以分成五种:表锁,行锁,页面锁,间隙锁,临键锁下面我们就来详细讲一下这些锁 1. 悲观锁 悲观锁对于数据库中数据的读写持悲观态度,即…

阿里同学聊测试开发与测试平台

在一线大厂&#xff0c;没有测试这个岗位&#xff0c;只有测开这个岗位&#xff0c;即使是做业务测试&#xff0c;那么你的title也是测开。 所以想聊一聊测开的看法&#xff0c;但不代表这是正确的看法&#xff0c;仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自动…

信钰证券:特斯拉掉队,英伟达冲锋!

截至当地时间2月16日收盘&#xff0c;美股三大指数上周累跌&#xff0c;结束五周连涨。其中&#xff0c;道指累计下跌0.11%&#xff0c;标普500指数周内跌幅为0.42%&#xff0c;以科技股为主的纳指则累跌1.34%。美股“科技七巨头”上周多数累跌&#xff0c;谷歌跌超5%&#xff…

【Node.js】介绍、下载及安装

一、什么是 Node.js Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端的应用程序 前端工程化&#xff1a;开发项目直到上线&#xff0c;过程中集成的所有工具和技术 Node.js 是前端工程…

基于python-socket构建任务服务器(基于socket发送指令创建、停止任务)

在实现ia业务服务器时需要构建一个python-socket客户端&#xff0c;1、要求能与服务器保持心跳连接&#xff0c;每10秒钟发送一次心跳信号&#xff1b;2、要求能根据socket服务器发送的指令创建或终止一个定时任务。 为此以3个类实现该功能&#xff0c;分别为socket通信类&…

ONLYOFFICE编辑器升级大揭秘:v8.0版新特性实测与评价

ONLYOFFICE编辑器升级大揭秘&#xff1a;v8.0版新特性实测与评价 一个人简介二前言三操作步骤创建房间我的文档 四开发人员工具应用程序接口Javascript开发工具包插件SDK网络钩子 五测评总结六体验地址 一个人简介 &#x1f3d8;️&#x1f3d8;️个人主页&#xff1a;以山河作…

阿里云OSS对象存储使用教程

一.OSS介绍 阿里云对象存储 OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供最高可达 99.995 % 的服务可用性。多种存储类型供选择&#xff0c;全面优化存储成本。 官网地址:https://www.aliyun.com/product/…

【Unity】双击C#脚本文件以单个文件打开(Visual Studio)、父类找不到、引用找不到、无法跳转等问题

问题&#xff1a;新安装一个Unity后&#xff0c;突然发现在工程里双击C#脚本&#xff0c;会一个一个打开&#xff0c;虽然也是用VS软件打开了&#xff0c;但是它无法被正确识别为Unity工程的C#脚本&#xff0c;也就是说所有命名空间无效&#xff0c;因为没关联上整个工程的解决…

STM32使用软件SPI协议操作TFT18彩屏

时间记录&#xff1a;2024/2/20 一、SPI协议介绍 &#xff08;1&#xff09;SPI设备通过4根线进行通信&#xff0c;CS片选线&#xff0c;选择从设备&#xff0c;SCK时钟线&#xff0c;由主设备产生时钟&#xff0c;主机MOSI线连从机MISO线&#xff0c;由主机向从机发送信息&am…

单片机03--按键--寄存器版

GPIO端口相关寄存器&#xff08;STM32F40x芯片&#xff09; 目标&#xff1a; 开关KEY1控制开灯。 分析&#xff1a; KEY1---PA0--->输入---->浮空输入/下拉输入 KEY1不导通时&#xff0c;PA0输入为低电平&#xff0c;KEY1导通时&#xff0c;PA0输入为高电平。 实现…

vitis安装及遇到的问题

ubuntu不能上网安装不了 我开始遇到&#xff1a;win 和 ubuntu可以互ping, 但是无法上网 1. 试一下&#xff1a;这里改成禁用 disable 2. 试一下这个 ping 8.8.8.8和ping www.baidu.com都OK&#xff0c;但是打不开网页-CSDN博客 安装过程&#xff1a; 安装文件&#xff1a;F…

C++从入门到精通 第十四章(STL容器)【下】

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

大数据信用报告查询方式一般有几种?哪种比较好?

在了解这个问题之前&#xff0c;想必你对大数据信用与人行信用的区别都是比较清楚了&#xff0c;本文呢就着重讲一下大数据信用报告查询方式有几种&#xff0c;哪种比较好&#xff0c;感兴趣的朋友不妨一起去看看。 大数据信用报告常见的三种查询方式&#xff1a; 一、二维码分…

SSH连接密码问题:原因、表现与解决方案

SSH连接密码问题&#xff1a;原因、表现与解决方案 写在最前面1. 密码错误2. SSH服务配置问题3. 账户锁定或禁用4. 密钥认证问题5. SSH版本不兼容6. 服务器负载或连接数过多7. IP地址被限制 小结 写在最前面 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0…

Flutter学习4 - Dart数据类型

1、基本数据类型 num、int、double &#xff08;1&#xff09;常用数据类型 num类型&#xff0c;是数字类型的父类型&#xff0c;有两个子类 int 和 double 通过在函数名前加下划线&#xff0c;可以将函数变成私有函数&#xff0c;私有函数只能在当前文件中调用 //常用数据…

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

力扣 309. 买卖股票的最佳时机含冷冻期

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C题解&#xff1a;动态规划 状态1&#xff1a;表示持有股票。更新为之前持有股票&#xff08;dp[i-1][0]&#xff09;或者不持有股票且不处于冷冻期后买入&…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)从零基础入门到精通!

温馨提示&#xff1a; 初学者最好不要上手就去搞漏洞挖掘&#xff0c;因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫&#xff0c;而且难度较大…… 较合理的途径应该从漏洞利用入手&#xff0c;不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料&#xff0c;分…