暑假算法日記第五天

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

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

LeetCode題目:

  • 683. K 個關閉的燈泡
  • 2067. 等計數子串的數量
  • 2524. 子數組的最大頻率分數
  • 2269. 找到一個數字的 K 美麗值
  • 1984. 學生分數的最小差值
  • 1461. 檢查一個字符串是否包含所有長度為 K 的二進制子串
  • 220. 存在重復元素 III

其他:

今日總結
往期打卡


683. K 個關閉的燈泡

跳轉: 683. K 個關閉的燈泡

問題:

n 個燈泡排成一行,編號從 1n 。最初,所有燈泡都關閉。每天 只打開一個 燈泡,直到 n 天后所有燈泡都打開。

給你一個長度為 n 的燈泡數組 blubs ,其中 bulbs[i] = x 意味著在第 (i+1) 天,我們會把在位置 x 的燈泡打開,其中 i 從 0 開始x 從 1 開始

給你一個整數 k ,請返回恰好有兩個打開的燈泡,且它們中間 正好k全部關閉的 燈泡的 最小的天數如果不存在這種情況,返回 -1

思路:

定長滑動窗口順序遍歷燈泡,如果窗口內所以元素都滿足更晚點亮,就更新ans(因為是按燈泡順序,不知道天數情況,必須遍歷一遍)
如果有更早的就直接更新窗口位置重新檢查窗口

復雜度:

  • 時間復雜度: O(n)O(n)O(n)
  • 空間復雜度: O(n)O(n)O(n)

代碼:

class Solution(object):def kEmptySlots(self, bulbs, k):days = [0] * len(bulbs)for day, position in enumerate(bulbs, 1):days[position - 1] = dayans = float('inf')left, right = 0, k+1while right < len(days):for i in range(left + 1, right):if days[i] < days[left] or days[i] < days[right]:left, right = i, i+k+1breakelse:ans = min(ans, max(days[left], days[right]))left, right = right, right+k+1return ans if ans < float('inf') else -1

2067. 等計數子串的數量

跳轉: 2067. 等計數子串的數量

問題:

給你一個下標從 0 開始的字符串 s,只包含小寫英文字母和一個整數 count。如果 s子串 中的每種字母在子串中恰好出現 count 次,這個子串就被稱為 等計數子串

返回 s等計數子串 的個數。

子串 是字符串中連續的非空字符序列。

思路:

滑動窗口遍歷k,2k到超出字符串長度或超過26k的窗口大小即可,維護字典和字典中值為k的個數,全部為k時計數

復雜度:

  • 時間復雜度: O(26?n)O(26 * n)O(26?n)
  • 空間復雜度: O(k)O(k)O(k)

代碼:

class Solution:def equalCountSubstrings(self, s: str, k: int) -> int:ans = 0for size in range(1,27):    # 26個字母,所以最多不會超過26,后面的都不用算j = size * kif j > len(s):breakcnt = Counter(s[:j])count = 0for i in cnt.values():if i == k:count += 1if count == size:   # 因為和是j,所以統計cnt里的k對上size即可ans += 1for i,ch in enumerate(s[j:]):if cnt[ch] == k:count -= 1cnt[ch] = cnt.get(ch,0) + 1if cnt[ch] == k:count += 1if cnt[s[i]] == k:count -= 1cnt[s[i]] -= 1if cnt[s[i]] == k:count += 1if count == size:ans += 1return ans

2524. 子數組的最大頻率分數

跳轉: 2524. 子數組的最大頻率分數

問題:

給定一個整數數組 nums 和一個 整數 k

數組的 頻率得分 是數組中 不同 值的 冪次 之和,并將和對 109 + 7 取模

例如,數組 [5,4,5,7,4,4] 的頻率得分為 (43 + 52 + 71) modulo (109 + 7) = 96

返回 nums 中長度為 k子數組最大 頻率得分。你需要返回取模后的最大值,而不是實際值。

子數組 是一個數組的連續部分。

思路:

直接滑動窗口維護冪次和即可
可以維護指數(頻率)字典,直接對出入值冪次加減
也可以維護冪次差值列表,增冪次加入差值,降冪次直接減差值即可

復雜度:

  • 時間復雜度: O(n)O(n)O(n)
  • 空間復雜度: O(k)O(k)O(k)

代碼:

# class Solution:
#     def maxFrequencyScore(self, nums: List[int], k: int) -> int:
#         cnt = Counter(nums[:k])
#         MOD = 10 ** 9 + 7
#         ans = score = sum([pow(i,j) for i,j in cnt.items()]) % MOD
#         for i,num in enumerate(nums[k:]):
#             if num in cnt:
#                 score -= pow(num,cnt[num])
#                 cnt[num] += 1
#                 score += pow(num,cnt[num])
#             else: 
#                 cnt[num] = 1
#                 score += num
#             score -= pow(nums[i], cnt[nums[i]])
#             cnt[nums[i]] -= 1
#             if cnt[nums[i]] == 0:
#                 del cnt[nums[i]]
#             else:
#                 score += pow(nums[i], cnt[nums[i]])
#             score = score % MOD
#             if score < 0:
#                 score += MOD
#             ans = max(ans,score)
#         return ansclass Solution:def maxFrequencyScore(self, nums: List[int], k: int) -> int:MOD = 10 ** 9 + 7ans = score = 0st_map = {}for i, x in enumerate(nums):if x not in st_map:score += xst_map[x] = [x]else:last = st_map[x][-1]cur = last * x % MODscore += cur - lastst_map[x].append(cur)if i >= k - 1:ans = max(ans, score % MOD)x = nums[i - k + 1]st = st_map[x]score -= st.pop()if st: score += st[-1]else: del st_map[x]return ans

2269. 找到一個數字的 K 美麗值

跳轉:2269. 找到一個數字的 K 美麗值

問題:

一個整數 numk 美麗值定義為 num 中符合以下條件的 子字符串 數目:

  • 子字符串長度為 k
  • 子字符串能整除 num

給你整數 numk ,請你返回 num 的 k 美麗值。

注意:

  • 允許有 前綴 0
  • 0 不能整除任何值。

一個 子字符串 是一個字符串里的連續一段字符序列。

思路:

滑動窗口維護好子數組的值即可,十進制出入和維護二進制值出入思路差不多
減去頭數乘10k?110^{k-1}10k?1后乘10,再加尾數即可

復雜度:

  • 時間復雜度: O(n)O(n)O(n)
  • 空間復雜度: O(n)O(n)O(n)

代碼:

class Solution:def divisorSubstrings(self, num: int, k: int) -> int:nums = list(map(int,str(num)))ans = cnt = 0kp = pow(10,k - 1)for i,x in enumerate(nums):cnt = cnt * 10 + xif i < k - 1:continueif cnt > 0 and num // cnt == num / cnt:ans += 1cnt -= kp * nums[i - k + 1]return ans

1984. 學生分數的最小差值

跳轉: 1984. 學生分數的最小差值

問題:

給你一個 下標從 0 開始 的整數數組 nums ,其中 nums[i] 表示第 i 名學生的分數。另給你一個整數 k

從數組中選出任意 k 名學生的分數,使這 k 個分數間 最高分最低分差值 達到 最小化

返回可能的 最小差值

思路:

排個序一個個差值找就行(盡可能讓最低分最高分靠近,即排序后序列中k長窗口的首尾),窗口大小為k的滑動窗口

復雜度:

  • 時間復雜度: O(nlogn)O(nlogn)O(nlogn)
  • 空間復雜度: O(1)O(1)O(1)

代碼:

class Solution:def minimumDifference(self, nums: List[int], k: int) -> int:if k == 1:return 0nums = sorted(nums)ans = nums[k - 1] - nums[0]for i in range(k,len(nums)):ans = min(nums[i] - nums[i - k + 1],ans)return ans

1461. 檢查一個字符串是否包含所有長度為 K 的二進制子串

跳轉: 1461. 檢查一個字符串是否包含所有長度為 K 的二進制子串

問題:

給你一個二進制字符串 s 和一個整數 k 。如果所有長度為 k 的二進制字符串都是 s 的子串,請返回 true ,否則請返回 false

思路:

滑動窗口往集合里塞窗口值,最后看看數量是不是最大值+1(算上0)
通過移位運算維護窗口值

復雜度:

  • 時間復雜度: O(n)O(n)O(n)
  • 空間復雜度: O(n)O(n)O(n)

代碼:

class Solution:def hasAllCodes(self, s: str, k: int) -> bool:m = len(s)upper = (1 << k) - 1mask = (1 << k - 1) - 1if m < (k + mask):return Falsenums = list(map(int, s[k:]))x = int(s[:k], 2)num_set = {x}for num in nums:x = ((x & mask) << 1) + numnum_set.add(x)return len(num_set) == upper + 1

220. 存在重復元素 III

跳轉: 220. 存在重復元素 III

問題:

給你一個整數數組 nums 和兩個整數 indexDiffvalueDiff

找出滿足下述條件的下標對 (i, j)

  • i != j,
  • abs(i - j) <= indexDiff
  • abs(nums[i] - nums[j]) <= valueDiff

如果存在,返回 true *;*否則,返回 false

思路:

順序遍歷,滑動窗口(可以看作固定i),判斷最值是否在范圍內,在直接返回True,遍歷完返回False
排序整個窗口獲得最值,這里使用排序列表

復雜度:

  • 時間復雜度: O(nlogk)O(nlogk)O(nlogk)
  • 空間復雜度: O(n)O(n)O(n)

代碼:

#         from sortedcontainers import SortedListclass Solution:def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:window = SortedList()for i in range(len(nums)):# len(window) == kif i > k:window.remove(nums[i - 1 - k])window.add(nums[i])idx = bisect.bisect_left(window, nums[i])if idx > 0 and abs(window[idx] - window[idx-1]) <= t:return Trueif idx < len(window) - 1 and abs(window[idx+1] - window[idx]) <= t:return Truereturn False

總結

結束定長滑動窗口專題

往期打卡

暑假算法日記第四天

暑假算法日記第三天

暑假算法日記第二天

暑假算法日記第一天

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90437.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【05】MFC入門到精通——MFC 為對話框中的控件添加變量 和 數據交換和檢驗

文章目錄四、 為對話框中的控件添加變量五、對話框類的5.1 為編輯框添加變量面步驟中 為對話框添加了幾個控件&#xff0c;包括三個靜態文本框&#xff0c;三個編輯框&#xff0c;一個按鈕控件。 四、 為對話框中的控件添加變量 編輯框中的數據可能會經常變化&#xff0c;有必…

4-Kafka-partition(分區)概念

Kafka Topic 分區詳解 &#x1f4cc; 一、分區核心概念 1. 什么是分區&#xff1f; 物理分片&#xff1a;Topic 被劃分為多個分區&#xff08;Partition&#xff09;&#xff0c;每個分區是一個有序、不可變的消息序列存儲單位&#xff1a;每個分區對應一個物理日志文件&…

論文略讀:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning

ACL 2021 LoRAPrefix TuningAdapter門控藍色參數是可訓練的參數

【論文閱讀】CogView: Mastering Text-to-Image Generation via Transformers

CogView&#xff1a;通過Transformers實現文本到圖像的生成簡介目標&#xff1a;通用領域中的文本到圖像生成一直是一個開放的問題&#xff0c;它既需要強大的生成模型&#xff0c;也需要跨模態的理解。為了解決這個問題&#xff0c;我們提出了CogView&#xff0c;一個具有VQ -…

Typecho與WordPress技術架構深度對比:從LAMP到輕量級設計

文章目錄 Typecho vs WordPress:深入比較兩大博客系統的優劣與選型指南引言1. 系統概述與技術架構1.1 WordPress架構分析1.2 Typecho架構特點2. 核心功能對比2.1 內容管理能力2.2 主題與模板系統3. 性能與擴展性對比3.1 系統性能基準測試3.2 擴展生態系統4. 安全性與維護成本4…

CSS揭秘:8.連續的圖像邊框

前置知識&#xff1a;CSS 漸變&#xff0c;5. 條紋背景&#xff0c;border-image&#xff0c;基本的 CSS 動畫前言 本文旨在實現圖片邊框效果&#xff0c;即在特定場景下讓圖片顯示在邊框而非背景區域。 一、傳統實現方案 正常我們面對這樣一個需求時&#xff0c;下意識會想到的…

Linux驅動學習day20(pinctrl子系統驅動大全)

一、Pinctrl作用Pinctrl(Pin Controller)&#xff1a;控制引腳引腳的枚舉與命名、引腳復用、引腳配置。Pinctrl驅動一般由芯片原廠的BSP工程師來寫&#xff0c;一般驅動工程師只需要在設備樹中指明使用哪個引腳&#xff0c;復用為哪個功能、配置為哪些狀態。二、Pin Controller…

Debiased All-in-one Image Restoration with Task Uncertainty Regularization

Abstract 一體化圖像恢復是一項基礎的底層視覺任務&#xff0c;在現實世界中有重要應用。主要挑戰在于在單個模型中處理多種退化情況。雖然當前方法主要利用任務先驗信息來指導恢復模型&#xff0c;但它們通常采用統一的多任務學習&#xff0c;忽略了不同退化任務在模型優化中的…

逆向 qq 音樂 sign,data, 解密 response 返回的 arraybuffer

解密 arraybuffer python requests 請求得到 arraybuffer&#xff0c;轉為 hex 傳遞給 js res_data sign ctx.call("decrypt", response.content.hex())function decrypt(hex) {const bytes new Uint8Array(hex.length / 2);for (let i 0; i < hex.length; i …

PPT處理控件Aspose.Slides教程:在 C# 中將 ODP 轉換為 PPTX

您是否正在尋找可靠的 PowerPoint SDK 來以編程方式開發ODP到PPTX轉換器&#xff1f;本篇博文演示了如何使用 C# 將 ODP 轉換為 PPTX。ODP是一種基于 XML 的演示文稿文件&#xff0c;可能包含圖像、視頻、文本等。但是&#xff0c;將打開的文檔演示文稿轉換為 PowerPoint 格式可…

[746] 使用最小花費爬樓梯

可以從下標0或者1作為起始位置————dp[0] dp[1] 0。一次性可以選擇移動1次或者2次&#xff0c;故當下標>2的時候&#xff0c;到達2有可能是從下標0開始或者下標1開始&#xff0c;cost[0] or cost[1]&#xff1b;到達n&#xff0c;有可能是花費cost[n-1]到達&#xff0c…

樹莓派vsftpd文件傳輸服務器的配置方法

在樹莓派上安裝和配置 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;服務器的步驟如下&#xff1a; 1. 安裝 vsftpd 打開終端&#xff0c;執行以下命令安裝 vsftpd&#xff1a; sudo apt update sudo apt install vsftpd安裝完成后&#xff0c;vsftpd 會自動啟動。可以…

4.服務注冊發現:微服務的神經系統

在微服務架構中,服務之間不再是固定連接,而是高度動態、短暫存在的。如何讓每個服務準確找到彼此,是分布式系統治理的核心問題之一。服務注冊發現機制,正如神經系統之于人體,承擔著連接、協調、感知變化的關鍵角色。 本文將圍繞 Netflix 開源的服務注冊發現組件 Eureka 展…

基于Docker Compose部署Traccar容器與主機MySQL的完整指南

Traccar Docker鏡像內嵌了H2數據庫&#xff0c;該數據庫容量有限&#xff0c;當達到一定容量時&#xff0c;定位數據無法寫入會導致無法定位顯示。為此有必要為Traccar 配置外部數據庫。根據官網文檔和自身經驗我選擇了MySQL。 參考的官方文檔 軟件環境為ubuntu server 24.04版…

paddlehub環境搭建和測試

目錄1.環境搭建1.1 創建conda環境1.2 安裝paddlepaddle和paddlehub1.3 安裝依賴2. 移動端模型部署2.1 安裝移動端模型2.2 測試3. 服務部署3.1 啟動PaddleHub Serving3.2 發送預測請求1.環境搭建 1.1 創建conda環境 conda create --name paddlehub python3.8 conda activate p…

408第三季part2 - 計算機網絡 - ip地址II

理解路由聚合就是從第一個不一樣的往后全置為0題目這里一般來說會到達2個目的地址&#xff0c;但中間有個路由&#xff0c;所以路由聚合一下就行了聚合出來這個然后下一跳就是跳到下一個路由器d前面一樣的不動&#xff0c;不一樣的開始全置為0c再次理解題目這個先匹配169.96.40…

【Unity】MiniGame編輯器小游戲(十一)消消樂【Crush】

更新日期:2025年7月9日。 項目源碼:獲取項目源碼 索引 消消樂【Crush】一、游戲最終效果二、玩法簡介三、正式開始1.定義游戲窗口類2.規劃游戲窗口、視口區域3.方塊 Block①.定義方塊類②.生成方塊所有類型③.生成消消樂棋盤④.繪制收集欄⑤.繪制方塊陣列4.查看方塊擋住的其他…

RK3588 Android SDK 實戰全解析 —— 架構、原理與開發關鍵點

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry RK3588 Android SDK 實戰全解析 —— 架構、原理與開發關鍵點 作者&#xff1a;嵌入式 Jerry 一、前言 隨著 AIoT、工業智…

從救火到賦能:運維的職責演進與云原生時代的未來圖景

引言:刻板印象的瓦解 提起"運維工程師",許多人腦海中可能仍會浮現這樣的畫面:深夜里守著閃爍的監控屏幕、手忙腳亂地重啟服務器、在布滿網線的機房里穿梭…這曾是運維工作的真實片段,但絕非全貌,更非未來。 在云計算、DevOps、SRE理念和云原生技術棧的沖擊下,…

UDP的socket編程

socket接口int socket(int domain, int type, int protocol);參數說明??參數說明domain協議族&#xff08;地址族&#xff09;&#xff0c;如 AF_INET&#xff08;IPv4&#xff09;、AF_INET6&#xff08;IPv6&#xff09;type套接字類型&#xff0c;UDP 使用 SOCK_DGRAM&…