LeetCode 第 425 场周赛 个人题解

ops/2024/11/27 21:42:57/

Q1. 最小正和子数组

原题链接

Q1. 最小正和子数组

思路分析

签到题,暴力就行

时间复杂度:O(N^2)

AC代码
class Solution:def minimumSumSubarray(self, nums: List[int], l: int, r: int) -> int:n = len(nums)res = -1acc = list(accumulate(nums, initial=0))for i in range(n):for j in range(i + l - 1, min(n, i + r)):if  acc[j + 1] - acc[i] > 0:if res == -1:res = acc[j + 1] - acc[i]else:res = min(res, acc[j + 1] - acc[i])return res

Q2. 重排子字符串以形成目标字符串

原题链接

Q2. 重排子字符串以形成目标字符串

思路分析

存一下s中每个块的数目和t的每个块比对下数量够不够

时间复杂度:O(N)

AC代码
class Solution:def isPossibleToRearrange(self, s: str, t: str, k: int) -> bool:cnt = Counter()n, m = len(s), len(t)if n % k: return FalseB = n // kfor i in range(0, n, B):cnt[s[i:i+B]] += 1for i in range(0, m, B):if cnt[t[i:i+B]] == 0:return Falsecnt[t[i:i+B]] -= 1return True

Q3. 最小数组和

原题链接

Q3. 最小数组和

思路分析

很典的dp

f(i, j, k) 为 [i, n - 1] 剩余 j 次 操作1,k次操作2的最小数组和

枚举当前的方案进行转移即可

时间复杂度:O(N OP1 OP 2)

AC代码
class Solution:def minArraySum(self, nums: List[int], v: int, op1: int, op2: int) -> int:n = len(nums)@cachedef dfs(i: int, j: int, k: int):if i == n: return 0res = nums[i] + dfs(i + 1, j, k)if j:res = min(res, (nums[i] + 1) // 2 + dfs(i + 1, j - 1, k))if k and nums[i] >= v:res = min(res, nums[i] - v + dfs(i + 1, j, k - 1))if j and k and nums[i] >= v:t = (nums[i] - v + 1) // 2if (nums[i] + 1) // 2 >= v:t = min(t, (nums[i] + 1) // 2 - v)res = min(res, t + dfs(i + 1, j - 1, k - 1))return resres = dfs(0, op1, op2)dfs.cache_clear()return res

Q4. 移除边之后的权重最大和

原题链接

Q4. 移除边之后的权重最大和

思路分析

树形dp + 贪心

每个边选或不选,容易想到树上背包

但是这个数据量,显然会炸掉,尝试优化

定义 f(u, lim) 为 u 所在子树最大合法化值,lim = true 说明<p, u> 的边被父节点拿掉了,否则没拿掉

所以 u 能够保存的边数目为 min(k - lim, adj[u] - 1)

我们假设 u 往下伸的所有边 都不拿,然后贪心的考虑拿谁

一条边 <u, v> 从不拿到拿的变化花费:f(v, true) + w - f(v, false)

即,按照f(v, true) + w - f(v, false) 从大到小拿即可

时间复杂度:O(nlogm)

AC代码
class Solution:def maximizeSumOfWeights(self, edges: List[List[int]], k: int) -> int:n = len(edges) + 1adj = [[] for _ in range(n)]for (u, v, w) in edges:adj[u].append([v, w])adj[v].append([u, w])@cachedef dfs(u: int, p: int, lim: bool) -> int:t = k - limh = []res = 0for (v, w) in adj[u]:if v == p: continuea = dfs(v, u, False)b = w + dfs(v, u, True)h.append(b - a)res += ah.sort(reverse=True)for i in range(min(t, len(h))):if h[i] <= 0: breakres += h[i]return resreturn dfs(0, -1, False)


http://www.ppmy.cn/ops/137182.html

相关文章

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…

自定义协议

1. 问题引入 问题&#xff1a;TCP是面向字节流的&#xff08;TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列&#xff0c;即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分&#xff0c;它只是确保数据的顺序和完整…

HarmonyOS开发者社区有奖征文二期活动开启!

HarmonyOS开发者社区有奖征文活动第二期如约而至&#xff01;在上一期的基础上&#xff0c;我们精心策划了更多样化的主题&#xff0c;旨在为开发者们提供一个更广阔的交流平台。无论您是想探讨HarmonyOS的技术细节&#xff0c;还是分享您的开发经验&#xff0c;或是记录您与Ha…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

WordCloud去掉停用词(fit_words+generate)的2种用法

-------------词云图集合------------- WordCloud去掉停用词&#xff08;fit_wordsgenerate&#xff09;的2种用法 通过词频来绘制词云图&#xff08;jiebaWordCloud&#xff09; Python教程95&#xff1a;去掉停用词词频统计jieba.tokenize示例用法 将进酒—李白process_t…

DrissionPage爬虫工具教程

当然可以&#xff01;下面是一些更高级和复杂的 DrissionPage 使用示例&#xff0c;包括处理动态加载的内容、处理登录和会话、处理多页面操作等。 处理动态加载的内容 许多现代网站使用 JavaScript 动态加载内容。在这种情况下&#xff0c;我们需要等待特定的元素出现&#…

笔记mfc11

Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作&#xff1a;一是把窗体类对象attach到一个windows窗体实体中&#xff08;即把一个窗体的hwnd赋给该类&#xff09;。另外就是把该类对象的消息加入到消息路由中&#xff0c;使得该类可以捕获消息。 让edit能…

python tkinter 控件实现鼠标悬停提示,提示文本动态展示

展示效果 全部代码和使用示例 # _*_ coding:utf-8 _*_ import tkinter as tk import pyautoguiscreen_width, screen_height pyautogui.size()class WidgetTip:"""鼠标悬停提示"""def __init__(self, widget, text):self.widget widgetself.…