暑假算法日记第三天

目标​:刷完灵神专题训练算法题单

阶段目标📌:【算法题单】滑动窗口与双指针

LeetCode题目:

  • 3439. 重新安排会议得到最多空余时间 I
  • 2134. 最少交换次数来组合所有的 1 II
  • 1297. 子串的最大出现次数
  • 2653. 滑动子数组的美丽值
  • 1888. 使二进制字符串字符交替的最少反转次数
  • 567. 字符串的排列
  • 438. 找到字符串中所有字母异位词
  • 30. 串联所有单词的子串
  • 2156. 查找给定哈希值的子串

其他:

今日总结
往期打卡


学习: 灵神:教你解决定长滑窗!

3439. 重新安排会议得到最多空余时间 I

跳转: 3439. 重新安排会议得到最多空余时间 I

问题:

给你一个整数 eventTime 表示一个活动的总时长,这个活动开始于 t = 0 ,结束于 t = eventTime

同时给你两个长度为 n 的整数数组 startTimeendTime 。它们表示这次活动中 n 个时间 没有重叠 的会议,其中第 i 个会议的时间为 [startTime[i], endTime[i]]

你可以重新安排 至多 k 个会议,安排的规则是将会议时间平移,且保持原来的 会议时长 ,你的目的是移动会议后 最大化 相邻两个会议之间的 最长 连续空余时间。

移动前后所有会议之间的 相对 顺序需要保持不变,而且会议时间也需要保持互不重叠。

请你返回重新安排会议以后,可以得到的 最大 空余时间。

注意,会议 不能 安排到整个活动的时间以外。

思路:

可以看作凑最大间隙,找间隙数组k+1长窗口能凑的最大值

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def maxFreeTime(self, eventTime: int, k: int, startTime: List[int], endTime: List[int]) -> int:gaps = [startTime[0]]for i in range(1,len(startTime)):gaps.append(startTime[i] - endTime[i - 1])gaps.append(eventTime - endTime[-1])ans = cnt = sum(gaps[:k + 1])for i in range(k + 1,len(gaps)):cnt += gaps[i] - gaps[i - k - 1]ans = max(ans,cnt)return ans

2134. 最少交换次数来组合所有的 1 II

跳转: 2134. 最少交换次数来组合所有的 1 II

问题:

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

思路:

环形可以拼接一遍除最后一元素的头部获得(不会走到两圈以上)

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution:def minSwaps(self, nums: List[int]) -> int:k = sum(nums)new_nums = nums + nums[:k]ans = cnt = sum(nums[:k])for i in range(k,len(new_nums)):cnt += new_nums[i] - new_nums[i - k]ans = max(ans,cnt)return k - ans

1297. 子串的最大出现次数

跳转: 1297. 子串的最大出现次数

问题:

给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

  • 子串中不同字母的数目必须小于等于 maxLetters
  • 子串的长度必须大于等于 minSize 且小于等于 maxSize

思路:

因为比minSize大的情况出现次数最大也必然有长为minSize的子串,所以直接看minSize就行
条件更新的滑动窗口,set(sub_s)可以直接去重

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

# class Solution:
#     def maxFreq(self, s: str, maxLetters: int, minSize: int, maxSize: int) -> int:
#         dict_cnt = {}
#         sub = s[:minSize]
#         dict_num = Counter(sub)
#         ans = 0
#         if len(dict_num) <= maxLetters:
#             ans = 1
#             dict_cnt[sub] = 1
#         for i in range(minSize, len(s)):
#             sub = sub[1:] + s[i]
#             temp = s[i - minSize]
#             dict_num[s[i]] = dict_num.get(s[i], 0) + 1
#             dict_num[temp] -= 1
#             if dict_num[temp] == 0:
#                 del dict_num[temp]
#             if len(dict_num) > maxLetters:
#                 continue
#             dict_cnt[sub] = dict_cnt.get(sub, 0) + 1
#             ans = max(ans, dict_cnt[sub])
#         return ans
class Solution:def maxFreq(self, s: str, maxLetters: int, minSize: int, maxSize: int) -> int:ans = 0n = len(s)cnt = defaultdict(int)for i in range(n - minSize + 1):sub_s = s[i: i + minSize]cnt[sub_s] += 1if cnt[sub_s] > ans and len(set(sub_s)) <= maxLetters:ans = cnt[sub_s]return ans

2653. 滑动子数组的美丽值

跳转:2653. 滑动子数组的美丽值

问题:

给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值

一个子数组的 美丽值 定义为:如果子数组中第 x 小整数负数 ,那么美丽值为第 x 小的数,否则美丽值为 0

请你返回一个包含 n - k + 1 个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k 的子数组的 美丽值

  • 子数组指的是数组中一段连续 非空 的元素序列。

思路:

主要是求第x小,可以用SortedList,也可以用哈希(这题 − 50 < = n u m s [ i ] < = 50 -50 <= nums[i] <= 50 50<=nums[i]<=50

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def getSubarrayBeauty(self, nums: List[int], k: int, x: int) -> List[int]:cnt = [0] * 101for i in nums[:k - 1]:cnt[i] += 1ans = [0] * (len(nums) - k + 1)for i in range(k - 1,len(nums)):cnt[nums[i]] += 1temp = 0for j in range(-50,0):if cnt[j] > 0:temp += cnt[j]if temp >= x:ans[i - k + 1] = jbreakcnt[nums[i - k + 1]] -= 1return ans

1888. 使二进制字符串字符交替的最少反转次数

跳转:1888. 使二进制字符串字符交替的最少反转次数

问题:

给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次:

  • 类型 1 :删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。
  • 类型 2 :选择 字符串 s 中任意一个字符并将该字符 反转 ,也就是如果值为 '0' ,则反转得到 '1' ,反之亦然。

请你返回使 s 变成 交替 字符串的前提下, 类型 2最少 操作次数 。

我们称一个字符串是 交替 的,需要满足任意相邻字符都不同。

  • 比方说,字符串 "010""1010" 都是交替的,但是字符串 "0100" 不是。

思路:

奇偶余数都一致或者都不一致两种情况取最小,因为可以把头部移到尾部,两种情况顺序也无所谓,所以可以直接拼接求滑动窗口一致或不一致的最小值反转

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def minFlips(self, s: str) -> int:s_new = [0] * (len(s) * 2 - 1)for i, ch in enumerate(s + s[:-1]):if int(ch) == i % 2:s_new[i] = 0else:s_new[i] = 1cnt = sum(s_new[: len(s)])ans = cnt if cnt <= len(s) / 2 else len(s) - cntfor i in range(len(s), len(s_new)):cnt += s_new[i] - s_new[i - len(s)]ans = min(ans, cnt if cnt <= len(s) / 2 else len(s) - cnt)return ans

567. 字符串的排列

跳转: 567. 字符串的排列

问题:

给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 的 排列。如果是,返回 true ;否则,返回 false

换句话说,s1 的排列之一是 s2子串

思路:

直接比较哈希表或字典(map)判断子串相等,滑动窗口更新字母出入

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:target_dict = Counter(s1)k = len(s1)s_dict = Counter(s2[:k])if target_dict == s_dict:return Truefor i in range(k,len(s2)):s_dict[s2[i]] = s_dict.get(s2[i],0) + 1s_dict[s2[i - k]] -= 1if s_dict[s2[i - k]] == 0:del s_dict[s2[i - k]]if target_dict == s_dict:return Truereturn False

438. 找到字符串中所有字母异位词

跳转: 438. 找到字符串中所有字母异位词

问题:

给定两个字符串 sp,找到 s 中所有 p异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

思路:

直接比较哈希表或字典(map)判断子串相等,滑动窗口更新字母出入,不同的是要记录全部索引

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:ans = []target_dict = Counter(p)s_dict = Counter(s[:len(p) - 1])for i,num in enumerate(s[len(p) - 1:]):s_dict[num] = s_dict.get(num,0) + 1if s_dict == target_dict:ans.append(i)s_dict[s[i]] -= 1if s_dict[s[i]] == 0:del s_dict[s[i]]return ans

30. 串联所有单词的子串

跳转: 30. 串联所有单词的子串

问题:

给定一个字符串 s 和一个字符串数组 words words 中所有字符串 长度相同

s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

  • 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef""abefcd""cdabef""cdefab""efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。

返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

思路:

需要一次记一个单词,但需要找全子串,所以0到单词长-1都要找
滑动窗口维护字典即可

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution:def findSubstring(self, s: str, words: List[str]) -> List[int]:m = len(words[0])target_dict = Counter(words)k = m * (len(words) - 1)ans = []for j in range(m):s_dict = {}for i in range(j,len(s),m):s_dict[s[i:i + m]] = s_dict.get(s[i:i+m],0) + 1if i < k:continueif target_dict == s_dict:ans.append(i - k)s_dict[s[i - k:i- k + m]] -= 1if s_dict[s[i - k:i- k + m]] == 0:del s_dict[s[i - k:i- k + m]]return ans

2156. 查找给定哈希值的子串

跳转: 2156. 查找给定哈希值的子串

问题:

给定整数 pm ,一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算:

  • hash(s, p, m) = (val(s[0]) * p0 + val(s[1]) * p1 + ... + val(s[k-1]) * pk-1) mod m.

其中 val(s[i]) 表示 s[i] 在字母表中的下标,从 val('a') = 1val('z') = 26

给你一个字符串 s 和整数 powermodulokhashValue 。请你返回 s第一个 长度为 k子串 sub ,满足 hash(sub, power, modulo) == hashValue

测试数据保证一定 存在 至少一个这样的子串。

子串 定义为一个字符串中连续非空字符组成的序列。

思路:

可以看到后k-1项可以提一个公因子power,所以要倒着算。且需要注意不要搞出负数
ord(num) - ord("a") + 1 可以用 ord(num) &31 替代 (前面11,即96会被掩去)

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution:def subStrHash(self, s: str, power: int, modulo: int, k: int, hashValue: int) -> str:powers = [1] * kfor i in range(1, k):powers[i] = powers[i - 1] * power % modulocnt = 0for i, num in enumerate(s[-k:]):cnt = (cnt + (ord(num) - ord("a") + 1) * powers[i]) % moduloans = len(s) - k if cnt == hashValue else 0kp = powers[-1] * power % modulofor i in range(len(s) - k - 1, -1, -1):cnt = (cnt * power+ (ord(s[i]) - ord("a") + 1)- (ord(s[i + k]) - ord("a") + 1) * kp) % moduloif cnt == hashValue:ans = ireturn s[ans : ans + k]

总结

今天继续练习了题单中定长滑动窗口系列的题目

往期打卡

暑假算法日记第二天

暑假算法日记第一天

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

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

相关文章

了解业务分析技术梗概

业务分析技术 以下基于BABOK V3框架&#xff0c;结合业务分析师&#xff08;BA&#xff09;的实际工作场景&#xff0c;系统梳理50项业务分析技术、常用工具、学习路径及文档应用指南。内容综合BABOK官方标准及行业实践&#xff0c;旨在提升BA的工作效能。 一、BABOK V3 技术体…

小红的数字删除 - 牛客

小红的数字删除 题目不难&#xff0c;忽略了一个 corner case&#xff0c;导致我在某次面试没有 AK。 10003 对于这个 case&#xff0c;只考虑前导零 全部删除是不对的&#xff0c;剩下的 3 也不能删。 void solve(){string s;cin >> s;int res0;vector<int> a(…

Linux网络: socket初识

一些概念 简单了解一下TCP,UDP这两个协议&#xff0c;和一些概念 TCP与UDP 学校教过TCP是 传输层协议有连接可靠传输面向字节流 而UDP是 传输层协议无连接不可靠传输面向数据报 当时完全不知道这些什么意思 网络字节序 网络通信&#xff0c;要接收和发送数据。我们知道…

AI时代的弯道超车之第二十七章:AI技术的发展方向

在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…

RabbitMQ用法的6种核心模式全面解析

文章目录**一、RabbitMQ核心架构解析**1. AMQP协议模型2. 消息流转原理**二、六大核心用法详解****1. 简单队列模式&#xff08;Hello World&#xff09;****2. 工作队列模式&#xff08;Work Queues&#xff09;****3. 发布/订阅模式&#xff08;Pub/Sub&#xff09;****4. 路…

深入协程调试:协程调试工具与实战

本文系统梳理主流协程调试工具&#xff0c;结合完整代码示例与实战技巧&#xff0c;助你高效解决异步编程难题一、协程调试的核心挑战 协程的非线性执行流是调试的最大挑战&#xff1a; 传统断点调试难以追踪协程切换堆栈信息不完整或丢失上下文并发竞争条件难以复现 #mermaid-…

Git 日常开发实战命令大全

&#x1f9f0; Git 日常开发实战命令大全 本文整理了 Git 在日常开发中高频使用的命令集合&#xff0c;覆盖从基础操作到进阶技巧的完整流程&#xff0c;方便留存查阅&#x1f440; &#xff0c;最后附上所有指令。其中内容包括&#xff1a; ✅ 本地仓库管理&#xff1a;添加文…

力扣 hot100 Day37

25. K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是…

【力扣 中等 C】516. 最长回文子序列

目录 题目 解法一 题目 待添加 解法一 int max(int a, int b) {return a > b ? a : b; }int longestPalindromeSubseq(char* s) {const int len strlen(s);int dp[len];for (int i len - 1; i > 0; i--) {dp[i] 1;int leftDown;if (i 1 < len) {leftDown dp…

DAY 54 Inception网络及其思考

知识点回顾&#xff1a; 传统计算机视觉发展史&#xff1a;LeNet-->AlexNet-->VGGNet-->nceptionNet-->ResNet 之所以说传统&#xff0c;是因为现在主要是针对backbone-neck-head这样的范式做文章 inception模块和网络特征融合方法阶段性总结&#xff1a;逐元素相加…

1. 微服务架构演进:从单体到SpringCloud

想象一下,你刚刚花了一个下午在生产环境下部署一款单体应用,结果因为一个微小的配置变动,整个系统宕机,大量用户投诉蜂拥而至。运维紧急回滚,开发又要加班定位问题……这并非孤立事件,而是单体架构在规模和复杂性增长后常见的“连锁反应”。 一、单体架构:简单之始,复杂…

Charles 中文版抓包工具详解:加速 API 调试与网络问题排查

随着技术的不断发展&#xff0c;开发者面临的任务日益复杂&#xff0c;特别是在调试和优化API接口时。确保应用的网络请求在各种环境下的稳定性和高效性是提高用户体验的关键。Charles抓包工具作为一款强大的网络调试工具&#xff0c;能够帮助开发者精确捕获HTTP/HTTPS流量&…

巅峰对话:文心4.5 vs DeepSeek R1 vs 通义Qwen3.0 深度评测

国产大模型三强争霸&#xff0c;谁主沉浮&#xff1f; 2025年是中国大模型开源爆发之年——百度文心4.5系列横空出世&#xff0c;阿里通义Qwen3.0登顶开源榜首&#xff0c;而DeepSeek R1在编程领域悄然登顶。 三大技术路线齐头并进&#xff0c;却走出了截然不同的道路。 在这…

Linux运维安全新范式:基于TCPIP与SSH密钥的无密码认证实战

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 在云原生架构全面渗透企业IT体系的当下&#xff0c;…

行阶梯形矩阵和行最简形矩阵的区别

目录 0、主元 一、行阶梯形矩阵&#xff08;REF&#xff09; 特点&#xff1a; 二、行最简形矩阵&#xff08;RREF&#xff09; 特点&#xff1a; 0、主元 主元是&#xff1a;该行最左侧的非零元素​​&#xff08;即第一个不为零的元素&#xff09;。 一、行阶梯形矩阵&…

力扣 3258 统计满足 K 约束的子字符串数量 I 题解

此题不评价&#xff0c;有点意思&#xff0c;我在次以两种语言python 和c&#xff0c;用两种相反的思路写&#xff0c;注意细节不同。 原题链接3258. 统计满足 K 约束的子字符串数量 I - 力扣&#xff08;LeetCode&#xff09; 法一&#xff0c;c&#xff0c;先统计出不符合的…

创意Python爱心代码

创意Python爱心代码分享的技术文章大纲 引言 简述Python在图形绘制和创意编程中的优势介绍爱心代码在编程社区中的受欢迎程度本文涵盖的创意爱心代码示例及其技术亮点 基础爱心绘制 使用数学公式和turtle库绘制简单爱心代码示例&#xff1a; import turtle def draw_heart…

OSPF路由过滤

一、概述 OSPF对接收的路由的过滤适用于任意OSPF路由器&#xff0c;是通过对接收的路由设置过滤 策略&#xff0c;只允许通过过滤策略的路由被添加到本地设备的IP路由表中&#xff08;对进入OSPF路由表不进行过滤&#xff09;&#xff0c;这主要是为了减小本地设备的IP路由表规…

NPM组件 nodemantle002 等窃取主机敏感信息

【高危】NPM组件 nodemantle002 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 nodemantle002 等NPM组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-qrk7-ayms处置建议强烈建议修复发现时间2025-07-04投毒…

山东布谷科技RC物联网络远程遥控车项目源码开发:直播行业的新机遇

在当今数字化时代&#xff0c;直播行业发展得如火如荼&#xff0c;各类基于直播的创新项目不断涌现。从 2024 年的弹幕游戏到 2025 年的RC远控车项目&#xff0c;这些都是泛直播行业衍生出的极具潜力的流量项目玩法。其中&#xff0c;山东布谷鸟网络科技有限公司推出的RC远程遥…