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

感谢你看到这里!一起加油吧!

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

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

相关文章

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…

【Python】解决Python报错:KeyError: ‘username‘

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 用户输入处理错误2.2 动态数据源 3. 解决方案3.1 使用 get() 方法3.2 检查键是否存在 4. 预防措施4.1 数据验证4.2 使用默认字典 (defaultdict) 结语 引言 在Python开发中&#xff0c;处理字典时遇到 KeyError 是一种…

Elastic 8.14:用于简化分析的 Elasticsearch 查询语言 (ES|QL) 正式发布

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.14 正式发布。 什么是新的&#xff1f; 8.14 版本最重要的标题是 ES|QL 的正式发布(GA)&#xff0c;它是从头开始设计和专门构建的&#xff0c;可大大简化数据调查。在新的查询引擎的…

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…

【DevOps】SD-WAN 详解:定义、架构、优势与应用

目录 一、传统 WAN 的局限性 二、SD-WAN 的解决方案 三、SD-WAN 的架构 四、SD-WAN的关键特点 五、SD-WAN 的优势 六、SD-WAN 的应用场景 七、总结 SD-WAN (Software-Defined Wide Area Network) 是一种利用软件定义网络 (SDN) 技术来简化分支机构与数据中心或云端之间连…

spdlog源码解析

基础抽象 #mermaid-svg-8Wlnt0sI42bDkciS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8Wlnt0sI42bDkciS .error-icon{fill:#552222;}#mermaid-svg-8Wlnt0sI42bDkciS .error-text{fill:#552222;stroke:#552222;}#…

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…

HC-SR505人体感应灯

1硬件 1.1硬件组成 1.正点原子探索者开发板 2 HC-SR505迷你小型人体感应模块 3 继电器&#xff0b;5V小灯 HC-SR505迷你小型人体感应模块介绍 1.2 硬件连接 1.HC-SR505&#xff08;连接在PE0&#xff09; 2.继电器&#xff08;连接在PE1&#xff09; 2.主要代码 int ma…

【nerf】nvidia-smi

当cmd下nvidia -smi不能使用时候 沿着以下路径打开cmd&#xff0c;再输入&#xff0c;可以查看cuda版本 然后查看电脑安装的

【QT5】<总览五> QT多线程、TCP/UDP

文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】&#xff1c;总览四&#xff1e; QT常见绘图、图表及动画。若存在…

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46&#xff0c; Leetcode 416 需强化知识点 背包理论知识 题目 卡码 46. 携带研究材料 01 背包理论基础01 背包理论基础&#xff08;滚动数组&#xff09;01 背包 二维版本&#xff1a;dp[i][j] 表示从下标为[0-i]的物…

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇&#xff1a;数据结构-二叉树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &…

Llama模型家族之Stanford NLP ReFT源代码探索 (四)Pyvene论文学习

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

实验三、拓扑布局和建立小型网络《计算机网络》

假期制定的各种计划但凡实施了一点&#xff0c;也不至于一点都没有实施。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1. 正确识别网络中使用的电缆线&#xff1b; 2. 为点对点网络和交换网络实施物理布线&#xff1b; 3. 验证每个网络的基本连通性。…

音视频转为文字SuperVoiceToText

音视频转为文字SuperVoiceToText&#xff0c;它能够把视频或语音文件高效地转换为文字&#xff0c;它是基于最为先进的 AI 大模型&#xff0c;通过在海量语音资料上进行训练学习而造就&#xff0c;具备极为卓越的识别准确率。 不仅如此&#xff0c;它支持包括汉语、英语、日语…

Java数据结构准备工作---常用类

文章目录 前言1.包装类1.1.包装类基本知识1.2.包装类的用途1.3.装箱和拆箱1.3.1.装箱&#xff1a;1.3.2.拆箱 1.4 包装类的缓存问题 2.时间处理类2.1.Date 时间类(java.util.Date)2.2.DateFormat 类和 SimpleDateFormat 类2.3.Calendar 日历类 3.其他常用类3.1.Math类3.2.Rando…

Diffusers代码学习: T2I Adapter

T2I Adapter是一款轻量级适配器&#xff0c;用于控制文本到图像模型并为其提供更准确的结构指导。它通过学习文本到图像模型的内部知识与外部控制信号&#xff08;如边缘检测或深度估计&#xff09;之间的对齐来工作。 T2I Adapter的设计很简单&#xff0c;条件被传递到四个特征…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

【Redis】Redis分布式锁的基本原理和具体实现

Redis 分布式锁是一种在分布式系统中使用 Redis 实现的锁机制&#xff0c;用于确保多个进程或线程在某个时间段内只有一个能够访问共享资源。它可以用于解决分布式环境下的并发问题。下面详细介绍 Redis 分布式锁的实现方法&#xff0c;包括其基本原理和具体实现。 基本原理 …

vue3模板语法总结

1. 响应式数据 Vue 3中的数据是响应式的&#xff0c;即当数据发生变化时&#xff0c;视图会自动更新。这是通过使用JavaScript的getter和setter来实现的。 2. 组件化 Vue 3采用组件化开发方式&#xff0c;允许创建可复用的组件。 每个组件都有自己的作用域&#xff0c;并且…