暑假算法日記第三天

目標?:刷完靈神專題訓練算法題單

階段目標📌:【算法題單】滑動窗口與雙指針

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
英文地址,請注明出處:http://en.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遠程遙…