Week4-LeetCode

1997.访问完所有房间的第一天

分析题目,可以得到两个要点:
1. 第一次到达房间i+1需要到达房间i两次
2. 到达当前房间i两次需要从nextVisit[i]再到i一次

f(i)为第一次到达房间i需要的时间,则第一次到达 i+1房间需要的时间为:

f(i + 1) = f(i) + f(i) - f(nextVisit[i])

注意: 访问房间i的那天算1天,访问房间i+11

class Solution:def firstDayBeenInAllRooms(self, nextVisit):mod = 10**9 + 7dp = [0] * (len(nextVisit))#初始化原地待一天+访问下一个房间一天dp[0] = 1for i in range(1, len(nextVisit)):dp[i] = (dp[i - 1] * 2 - dp[nextVisit[i-1]] + 2) % (10 ** 9 + 7)return (dp[-1] - 1) % (10 ** 9 + 7)

2684. 矩阵中移动的最大次数

  1. 动态规划
    本人采用了动态规划的思路,但代码存在问题,有一半的测试用例不通过,故找到类似思路且通过了的代码粘贴在下:
    class Solution(object):def maxMoves(self, grid):""":type grid: List[List[int]]:rtype: int"""# 动态规划m, n = len(grid), len(grid[0])dp = [[0] * n for _ in range(m)]res = 0for j in range(n - 2, -1, -1):for i in range(m):for k in i - 1, i, i+1:if 0 <= k < m and grid[k][j + 1] > grid[i][j]:dp[i][j] = max(dp[i][j], dp[k][j + 1] + 1)for i in range(m):res = max(res, dp[i][0])return res
    

310.最小高度树

关键思路:设dist[x][y]表示节点x到节点y的距离,假定树中距离最长的两个节点为(x, y), 它们之间的距离为maxdist = dist[x][y],则树的最小高度minheight一定为 ⌈ m a x d i s t 2 ⌉ \lceil\frac{maxdist}{2}\rceil 2maxdist

  1. 广度优先搜索

    class Solution(object):
    def findMinHeightTrees(self, n, edges):""":type n: int:type edges: List[List[int]]:rtype: List[int]"""if n == 1:return [0]# 邻接矩阵g = [[] for _ in range(n)]for x, y in edges: g[x].append(y)g[y].append(x)# 记录父节点parents = [0] * n# 广度优先遍历def bfs(start):vis = [False] * n # 标记是否访问过vis[start] = Trueq = deque([start])  # 创建一个双端队列 并将起始元素start放入队列中while q:x = q.popleft() #for y in g[x]:if not vis[y]:vis[y] = Trueparents[y] = xq.append(y)return xx = bfs(0) # 找到与节点 0 最远的节点 xy = bfs(x) # 找到与节点 x 最远的节点 ypath = []parents[x] = -1while y != -1:path.append(y)y = parents[y]m = len(path)return [path[m//2]] if m % 2 else[path[m // 2 - 1], path[m // 2]]
    
  2. 深度优先搜索

    class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:if n == 1:return [0]g = [[] for _ in range(n)]for x, y in edges:g[x].append(y)g[y].append(x)parents = [0] * nmaxDepth, node = 0, -1def dfs(x: int, pa: int, depth: int):nonlocal maxDepth, nodeif depth > maxDepth:maxDepth, node = depth, xparents[x] = pafor y in g[x]:if y != pa:dfs(y, x, depth + 1)dfs(0, -1, 1)maxDepth = 0dfs(node, -1, 1)path = []while node != -1:path.append(node)node = parents[node]m = len(path)return [path[m // 2]] if m % 2 else [path[m // 2 - 1], path[m // 2]]
    

2952.需要添加的硬币的最小数量

  1. 贪心算法
    关键思路:
    对于正整数x,如果区间[1, x-1]内的所有金额都可取得,且x在数组中,则区间[1, 2x-1]内的所有金额也都可取得。
    贪心:每次找到不可取得的最小金额x,在数组中添加x直到找到下一个不可取得的最小整数

    def minimumAddedCoins(self, coins, target):""":type coins: List[int]:type target: int:rtype: int"""coins.sort()ans, x = 0, 1index = 0while x<= target:if index < len(coins) and coins[index] <= x:x += coins[index]index += 1else:ans += 1x <<= 1return ans
    

8.字符串转换整数(atoi)

  1. 自动机
    关键思路:我们的程序在每个时刻有一个状态 s,每次从序列中输入一个字符 c,并根据字符 c 转移到下一个状态 s'

    INT_MAX = 2 ** 31 - 1
    INT_MIN = -2 ** 31class Automaton:def __init__(self):self.state = 'start'self.sign = 1 # 不带符号默认为正整数self.ans = 0self.table = {'start':['start', 'signed', 'in_number','end'],'signed':['end', 'end', 'in_number', 'end'],'in_number':['end', 'end', 'in_number', 'end'],'end':['end', 'end', 'end', 'end'],}def get_col(self, c):if c.isspace():return 0if c == '+' or c == '-':return 1if c.isdigit():return 2return 3def get(self, c):self.state = self.table[self.state][self.get_col(c)]if self.state == 'in_number':self.ans = self.ans * 10 + int(c)self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)elif self.state == 'signed':self.sign = 1 if c == '+' else -1class Solution(object):def myAtoi(self, s):""":type s: str:rtype: int"""automaton = Automaton()for c in s:automaton.get(c)return automaton.sign * automaton.ans
    

331.验证二叉树得前序序列化

关键思路:利用栈

    def isValidSerialization(self, preorder):""":type preorder: str:rtype: bool"""stack = []for node in preorder.split(','):stack.append(node)while len(stack) >= 3 and stack[-1] == stack[-2] == '#' and stack[-3] !='#':stack.pop(), stack.pop(), stack.pop()stack.append('#')return len(stack) == 1 and stack.pop() == '#'

10.正则表达式匹配

思路:动态规划
使用dp[i][j]表示s的前i个字符与p中的前j个字符是否能够匹配。
动态规划的边界条件为f[0][0]=true,即两个空字符串是可以匹配的
从右往左扫描,s, p串是否匹配取决于最右端是否匹配、剩余的子串是否匹配

边界条件:

  1. s[i - 1] == p[j - 1]
    那么:dp[i][j] = dp[i - 1][j - 1]

  2. s[i - 1] != p[j - 1]

    1. p[i - 1] == '*' and s[i - 1] == p[j - 2] ,关于and的第二个条件,可以展开以下讨论:
      • p[j - 1]*可以让p[j - 2]p串中消失
        那么dp[i][j] = dp[i][j - 2]
      • p[j-2] 重复1次 (这个时候p的最后一个字符和s的倒数第二个字符是匹配的)
        那么 dp[i][j] = dp[i -1][j -2]
      • p[j - 2]重复 ≥ \geq 2
        那么dp[i][j] = dp[i-1][j]
  3. p 为空串,s 不为空串,肯定不匹配。
    s 为空串,但 p 不为空串,要想匹配,只可能是右端是星号,它干掉一个字符后,把 p 变为空串。
    s、p 都为空串,肯定匹配。

class Solution:def isMatch(self, s, p):if s is None or p is None:return FalsesLen, pLen = len(s), len(p)dp = [[False] * (pLen + 1) for _ in range(sLen + 1)]# base casedp[0][0] = Truefor j in range(1, pLen + 1):if p[j - 1] == "*":dp[0][j] = dp[0][j - 2]# 迭代for i in range(1, sLen + 1):for j in range(1, pLen + 1):if s[i - 1] == p[j - 1] or p[j - 1] == ".":dp[i][j] = dp[i - 1][j - 1]elif p[j - 1] == "*":if s[i - 1] == p[j - 2] or p[j - 2] == ".":dp[i][j] = dp[i][j - 2] or dp[i - 1][j - 2] or dp[i - 1][j]else:dp[i][j] = dp[i][j - 2]return dp[sLen][pLen]

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

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

相关文章

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…

slowhttp攻击漏洞原理解析和防御,以及LiqunKit 综合漏洞利用工具详细使用

slowhttp攻击漏洞原理解析和防御,以及LiqunKit 综合漏洞利用工具详细使用。 Slowhttp攻击是一种拒绝服务(DoS)攻击,它利用了HTTP协议的一些特性来耗尽服务器资源,导致服务器对正常请求的响应变慢或无法响应。这种攻击的特点是长时间占用服务器的连接,而不是发送大量流量…

JSQLParserException异常

前言 SQL中加入了租户字段&#xff0c;报这个错&#xff0c;可以查出数据&#xff0c;但是不多&#xff1b;SQL检查无问题 解决 原因一 引入新的SQL解析器检查解析SQL&#xff0c;与mybatis多租户无关 参考 <!--jsqlparser版本太低也无法解析&#xff0c;如2.0--> &…

2024 年高效开发的 React 生态系统

要使用 React 制作应用程序&#xff0c;需要熟悉正确的库来添加您需要的功能。例如&#xff0c;要添加某个功能&#xff08;例如身份验证或样式&#xff09;&#xff0c;您需要找到一个好的第三方库来处理它。 在这份综合指南中&#xff0c;我将向您展示我建议您在 2024 年使用…

Xilinx浮点处理IP使用说明和测试

Xilinx浮点处理IP使用说明和测试 1 浮点数标准2 IP接口信号3 Python计算4 Vivado仿真本文主要介绍Xilinx浮点数处理IP Floating-point的使用和测试方法。 1 浮点数标准 浮点数的定义遵循IEEE-754标准,32位浮点数定义如下。 1位符号位(S):0表示正数,1表示负数8位指数位(E):…

C语言预处理详解

预处理是什么 在我们写完C语言程序的时候当我们开始运行程序时&#xff0c;程序会经过预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接这些过程之后才会生成可执行程序&#xff0c;这里我们讲的是预处理&#xff0c;预处理是编译的第一个阶段&#xff0c;在这个阶段&a…

传参的指针,你的值到底变了没?!(有关函数形参修改的另类案例)

我们都知道&#xff0c;想要在函数中修改某个变量的值&#xff0c;传变量本身是没有用的。原因在于不同的函数在不同的空间上&#xff0c;函数的生命周期随着函数的调用而结束&#xff0c;因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变…

网关未配置导致不同网段ping不通的小问题

问题背景&#xff1a; 搞来两台服务器&#xff0c;想用这两台装vmware来分配多个虚拟机来做开发测试 每台有两个网口&#xff0c;现在只需要一个网口就可以&#xff0c;之后想配置&#xff0c;再从vmware页面上配置&#xff0c;机房环境不是很好&#xff0c;在地下室&#xf…

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…

C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

0xaaaaaaaa...等是什么&#xff1f;-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137179252 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << …

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…

深入理解zookeeper

如果是zookeeper的初学者&#xff0c;可以看&#xff1a; zookeeper快速入门&#xff08;合集&#xff09;-CSDN博客 如果想要深入理解zookeeper&#xff0c;并在面试中取得更好的表现&#xff0c;可以看下面的文章&#xff0c;都是偏面试向的角度写的。 三分钟明白zookeeper…

名字真的会影响我们的职业吗?

名字是我们身份的一部分&#xff0c;人们往往喜欢将一个人名字同一种具体的职业联系在一起&#xff0c;而如果这个人名字看上去更适合一项工作&#xff0c;那么他&#xff08;她&#xff09;就有更多的机会得到这份工作。因此&#xff0c;我们在给福主取名改名时也会与职业特点…

10.Python异常处理

为增强程序的健壮性&#xff0c;我们也需要考虑异常处理方面的内容。例如 &#xff0c;在读取文件时需要考虑文件不存在、文件格式不正确等异常情况。这 就是本章要介绍的异常处理。 1 第一个异常——除零异常 在数学中&#xff0c;任何整数都不能除以0&#xff0c;如果在计算…

PCL 计算点与圆的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 3D中的圆可以有圆心、半径以及法线来进行表示,如下图所示: 这里我们假设: Δ = P − C \Delta=P-C Δ

Wasm初上手

总之也是为了扩宽技术面吧。。。我也不知道为什么就想试试了&#xff0c;就酱。 参考阅读&#xff1a;极客时间《WebAssembly入门课》 安装wasm的编译器Emscripten。Emscripten 是一个“源到源”语言编译器工具集&#xff0c;这个工具集可以将 C/C 代码编译成对应 JavaScript 代…

【PostgreSQL】- 1.4 PostgreSQL 业务规划(创建 Schema)

业务规划与创建 Schemas 如果实际场景&#xff0c;有业务A、业务B、业务C&#xff0c;推荐的方式是在同一个数据库中为每个业务创建不同的 schema。然后&#xff0c;你可以为每个业务创建不同的账户&#xff0c;并赋予这些账户对应业务的 schema 权限。这种方式的好处是&#…

CSS使用clip-path实现元素动画

前言&#xff1a; 在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 目录 前言&#xff1a; clip-path到底是什么&#xff1f; clip-pa…

【御控物联】 JavaScript JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…