2024.6.9刷题记录
目录
一、1103. 分糖果 II
1.模拟
2.数学
二、312. 戳气球
1.递归-记忆化搜索
2.区间dp
三、2. 两数相加
1.迭代
2.递归-新建节点
3.递归-原节点
四、4. 寻找两个正序数组的中位数
1.堆
2.双指针+二分
五、5. 最长回文子串
1.动态规划
2.中心扩展算法
六、6. Z 字形变换
1.模拟-规律
2.巧设flag
七、7. 整数反转
1.模拟
2.考虑溢出问题-模拟一下(错误代码)
一、1103. 分糖果 II
1.模拟
class Solution:def distributeCandies(self, candies: int, num_people: int) -> List[int]:# 模拟ans = [0] * num_peoplenum = 1while candies > 0:i = (num - 1) % num_peopleans[i] += min(num, candies)candies -= numnum += 1return ans
2.数学
来自灵神题解(. - 力扣(LeetCode))。将添加操作分为“完整行”、“完整数”(最后一行中)、“不完整数”(最后一格)三个部分进行处理。
class Solution:def distributeCandies(self, candies: int, num_people: int) -> List[int]:# 数学# m = sqrt(8 * candies + 1) - 1) // 2 # 是错误的,当被除数为浮点数时,整除结果还是为浮点数m = int((sqrt(8 * candies + 1) - 1) / 2) # 前面完整的项数k, extra = divmod(m, num_people)ans = [(k - 1) * k * num_people // 2 + k * (i + 1) + \(k * num_people + i + 1 if i < extra else 0) \for i in range(num_people)]ans[extra] += candies - m * (m + 1) // 2return ans
二、312. 戳气球
1.递归-记忆化搜索
来自官方题解(. - 力扣(LeetCode))。
class Solution:def maxCoins(self, nums: List[int]) -> int:# 递归-记忆化搜索# 逆向思维,将搓破气球改为放入气球n = len(nums)val = [1] + nums + [1]@cachedef solve(left: int, right: int) -> int:# 开区间,返回最大数量if left >= right - 1:# 空区间return 0best = 0for i in range(left + 1, right):# 遍历区间值得最大值total = val[left] * val[i] * val[right]# 在区间内放入一个,左右都是固定的total += solve(left, i) + solve(i, right) # 在左右分别放入best = max(best, total)return bestreturn solve(0, n + 1) # 现在是针对于val数组
2.区间dp
来自官方题解。
class Solution:def maxCoins(self, nums: List[int]) -> int:# 区间dp# 使用二维数组表示区间n = len(nums)dp = [[0] * (n + 2) for _ in range(n + 2)]val = [1] + nums + [1]# dp要由小到大蔓延for i in range(n - 1, -1, -1):# 开区间, j - i > 1for j in range(i + 2, n + 2):for k in range(i + 1, j):total = val[i] * val[k] * val[j]total += dp[i][k] + dp[k][j]dp[i][j] = max(dp[i][j], total)return dp[0][n + 1]
三、2. 两数相加
1.迭代
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 迭代carry = 0dummy = ListNode()cur = dummywhile l1 or l2 or carry:if l1: carry += l1.vall1 = l1.nextif l2:carry += l2.vall2 = l2.nextcur.next = ListNode(val = carry % 10)cur = cur.nextcarry //= 10return dummy.next
2.递归-新建节点
判断边界的时候只想着有carry的情况,而没有返回无carry的情况(None)导致运行超时,修改后运行通过。我当时还以为我递归写错了,参考了灵神的递归才发现问题。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 递归-新建节点def addTwo(l1, l2, carry = 0):if not l1 and not l2:return ListNode(val = carry) if carry else Nonecarry += (l1.val if l1 else 0) + (l2.val if l2 else 0)nxt = addTwo(l1.next if l1 else None, l2.next if l2 else None, carry // 10)return ListNode(val = carry % 10, next = nxt)return addTwo(l1, l2)
3.递归-原节点
来自灵神题解(. - 力扣(LeetCode))。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode], carry = 0) -> Optional[ListNode]:# 递归-原节点# 均在l1表的基础上修改if not l1 and not l2:# 这里是关键,一定还得记得Nonereturn ListNode(val = carry) if carry else Noneif not l1:l1, l2 = l2, l1carry += l1.val + (l2.val if l2 else 0)l1.val = carry % 10l1.next = self.addTwoNumbers(l1.next, l2.next if l2 else None, carry // 10)return l1
四、4. 寻找两个正序数组的中位数
1.堆
时复O(m + n), 空复O(m + n)。但是堆没有运用到本身已经有序的这一特点。
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:# 堆# 时复O(m + n), 空复O(m + n)m, n = len(nums1), len(nums2)q = nums1 + nums2heapq.heapify(q) # 原地堆化for _ in range((m + n - 1) // 2):heapq.heappop(q)return (heapq.heappop(q) + heapq.heappop(q)) / 2 if (m + n) % 2 == 0 else heapq.heappop(q)
2.双指针+二分
时复O(log(min(m,n))),空复O(1)。来自题解(. - 力扣(LeetCode))。题解作者使用的是左闭右开区间,博主本人二分习惯使用闭区间,所以改为了闭区间写法。
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:# 双指针+二分# 时复O(log(min(m,n))),空复O(1)n1 = len(nums1)n2 = len(nums2)if n1 > n2:# 使查找较短数组return self.findMedianSortedArrays(nums2, nums1)k = (n1 + n2 + 1) // 2left = 0right = n1 - 1# 二分留在左边的nums1的个数while left <= right:# 闭区间m1 = (left + right) // 2m2 = k - m1 # 留在左边的nums2的个数# 当nums2划分多了的时候,左边的nums2最后一位是大于右边nums1的第一位if nums1[m1] < nums2[m2 - 1]: # checkleft = m1 + 1else:right = m1 - 1m1 = leftm2 = k - m1# 左边最大值# m1是个数,m1 - 1是下标# 注意,划分个数是确定了,但是大小没有确定c1 = max(nums1[m1 - 1] if m1 > 0 else float("-inf"), nums2[m2 - 1] if m2 > 0 else float("-inf"))if (n1 + n2) % 2 == 1:return c1c2 = min(nums1[m1] if m1 < n1 else float("inf"), nums2[m2] if m2 < n2 else float("inf"))return (c1 + c2) / 2
五、5. 最长回文子串
不会,均来自官方题解(. - 力扣(LeetCode))。
1.动态规划
class Solution:def longestPalindrome(self, s: str) -> str:# 动态规划n = len(s)if n < 2:return smax_len = 1begin = 0# dp[i][j] 表示 s[i..j] 是否是回文串dp = [[False] * n for _ in range(n)]# 记得初始化for i in range(n):# 长度为1是回文dp[i][i] = True# 递推# 先枚举子串长度,从小到大for L in range(2, n + 1):# 枚举左边界for i in range(n):# 右边界j - i + 1 = Lj = L + i - 1# 右边界越界if j >= n:breakif s[i] != s[j]:dp[i][j] = Falseelse:if j - i < 3:dp[i][j] = Trueelse:dp[i][j] = dp[i + 1][j - 1] # 内串是否为回文串# 更新if dp[i][j] and j - i + 1 > max_len:max_len = j - i + 1begin = i # 记录起始位置,方便返回return s[begin: begin + max_len]
2.中心扩展算法
class Solution:def expandAroundCenter(self, s: str, left: int, right: int):# 中心扩展算法while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1right += 1return left + 1, right - 1 # 符号条件的def longestPalindrome(self, s: str) -> str:# 中心扩展算法start, end = 0, 0for i in range(len(s)):# 边界条件1,初始中心串长度为1left1, right1 = self.expandAroundCenter(s, i, i)# 边界条件2,初始中心串长度为2left2, right2 = self.expandAroundCenter(s, i, i + 1)if right1 - left1 > end - start:start, end = left1, right1if right2 - left2 > end - start:start, end = left2, right2return s[start: end + 1]
六、6. Z 字形变换
1.模拟-规律
class Solution:def convert(self, s: str, numRows: int) -> str:# 模拟-规律# 将每一条竖线(斜线)分开看# 第一行和最后一行为重叠部分if numRows == 1:return sans = []n = len(s)for row in range(numRows):if row != 0 and row != numRows - 1:# 普通竖线(斜线)for j in range(row, n, (numRows - 1)* 2):# 竖线ans.append(s[j])# 斜线idx = j + 2 * (numRows - 1 - row)if idx < n:ans.append(s[idx])else:# 第一行和最后一行,重叠部分,特判for j in range(row, n, (numRows - 1)* 2):ans.append(s[j])return ''.join(ans)
2.巧设flag
来自题解(. - 力扣(LeetCode))。很妙!
class Solution:def convert(self, s: str, numRows: int) -> str:# 巧设flag# 行数先增后减,使用flag模拟if numRows < 2:return sans = ["" for _ in range(numRows)]i, flag = 0, -1 # flag代表增减ifor c in s:ans[i] += c# 边界处转换if i == 0 or i == numRows - 1: flag = -flagi += flagreturn ''.join(ans)
七、7. 整数反转
1.模拟
python一般不会出现溢出的问题,所以实际上并没有受到限制,题主也就并没有答到考点。
class Solution:def reverse(self, x: int) -> int:# 模拟x, flag = (x, 1) if x >= 0 else (-x, -1)ans = 0while x > 0:ans *= 10 # 进位ans += x % 10x //= 10return flag * ans if - 2 ** 31 <= flag * ans <= 2 ** 31 - 1 else 0
2.考虑溢出问题-模拟一下(错误代码)
来自题解(. - 力扣(LeetCode)),讲解非常通俗易懂。虽然python不用考虑,但是还是应该学习一下。
class Solution:def reverse(self, x: int) -> int:# 考虑溢出问题-模拟一下(错误代码)# 由于python的自动转换机制,并不能实现# 该代码是运行错误的INT_MAX_VALUE = 2 * 31 - 1 # 错误问题出在这里INT_MIN_VALUE = - 2 ** 31ans = 0while x != 0:pop = x % 10if ans > INT_MAX_VALUE // 10 or (ans == INT_MAX_VALUE // 10 and pop > 7):return 0if ans < INT_MIN_VALUE // 10 or (ans == INT_MIN_VALUE // 10 and pop < -8):return 0ans = ans * 10 + popx //= 10return ans
完
感谢你看到这里!一起加油吧!
相关文章:
2024.6.9刷题记录
目录 一、1103. 分糖果 II 1.模拟 2.数学 二、312. 戳气球 1.递归-记忆化搜索 2.区间dp 三、2. 两数相加 1.迭代 2.递归-新建节点 3.递归-原节点 四、4. 寻找两个正序数组的中位数 1.堆 2.双指针二分 五、5. 最长回文子串 1.动态规划 2.中心扩展算法 六、6. Z…...

Matlab|遗传粒子群-混沌粒子群-基本粒子群
目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 很多同学在发文章时候最犯愁的就是创新点创新点创新点(重要的事情说三遍),对于采用智能算法的模型,可以采用算法改进的方式来达到提高整个文章创新水平的目的&…...

31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络
前面两篇文章我们分析了HTTP/1和HTTP/2,在HTTP/2出现之前,开发者需要采取很多变通的方式来解决HTTP/1所存在的问题,不过HTTP/2在2018年就开始得到了大规模的应用,HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…...

2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】
【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。 润年的条件: 1. 能被 4 整除,但不能被 100 整除的年份; 2. 能被 100 整除,又能被 400 整除的年份; 设 y 为被检测的年份,则算法可表示如下…...
Python中的上下文管理器(contextlib)模块
Python中的contextlib模块提供了一些用于创建和管理上下文管理器(context managers)的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象,它们通常用于确保在代码块执行前后执行某些操作,比如资源获取与释放、设置和重…...

C语言:定义和使用结构体变量
定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中,结…...

Vue3学习第二天记录
Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…...

C语言:双链表
一、什么是双链表? 双链表,顾名思义,是一种每个节点都包含两个链接的链表:一个指向下一个节点,另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比,双链表不仅可以…...

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]
背景: 使用JavaSEJDBCMySQL技术实现一个物业管理系统,具体要求如下 物业管理系统需求: 需求分析 1.1用户需求分析 在进入系统之前,要进行身份确认,只有用户名和用户密码都相符的用户方可进入本系统,为…...

未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。.net 读取excel的时候报错(实测有效)
1. 下载AccessDatabaseEngine.exe 下载链接 添加链接描述 2. office excel是64为的需要安装【AccessDatabaseEngine.exe】、32位的【AccessDatabaseEngine_X64.exe】 3. 我的是64为,跳过32位安装检测 1. 找到下载的安装包 2.输入安装包文件全称并在后面加上/pas…...

JVM垃圾收集器和性能调优
目标: 1.JVM垃圾收集器有哪几种? 2.CMS垃圾收集器回收步骤。 一、JVM常见的垃圾回收器 为什么垃圾回收的时候需要STW? 标记垃圾的时候,如果不STW,可能用户线程就会不停的产生垃圾。 1.1 单线程收集 Serial和SerialOld使用单…...

汽车EDI——Volvo EDI 项目案例
项目背景 作为Volvo的长期合作伙伴,C公司收到Volvo的EDI对接邀请,需要实现EDI对接。C公司将会面临哪些挑战?又应该相应地选择何种EDI解决方案呢? 汽车行业强调供需双方的高效协同(比如研发设计、生产计划、物流信息等…...

Qt应用程序发布
一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…...
Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库
Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库 目录 Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库...

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)
文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-…...

[word] word如何清除超链接 #媒体#笔记#知识分享
word如何清除超链接 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享下word如何清除超链接的操作办法,一起来学习下吧! 1、清除所有超链接 按下组合键CtrlshiftF9,就可以将网上复制带有超链…...

【Linux】进程(9):进程控制1
大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1 fork函数2 进程终止(A)终止是…...

华为RH2288H V3服务器iBMC的SSL证书续期
本文对华为RH2288H V3服务器iBMC的SSL证书续期,以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC,点击配置--SSL证书,如下: 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…...
ubuntu开机黑屏
BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands. 解决: help 看看哪个盘出问题了 fsck -y /dev/sda1 (出问题的磁盘/分区) reboot 就可以进入系统了 fsck命令…...
【risc-v】arm和riscv有什么关系或者联系?
ARM和RISC-V都是基于精简指令集计算(RISC)原理的处理器架构,它们在设计理念上有一定的联系,但同时存在一些关键的区别: 设计理念:ARM和RISC-V都采用了RISC的核心设计原则,即通过简化指令集来提高…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...