2461。長度為 K
的不同子數組的最大和難度:中
主題:陣列、雜湊表、滑動視窗
給定一個整數數組 nums 和一個整數 k。求 nums 的所有子數組滿足以下條件的最大子數組和:
- 子數組的長度為k,且
- 子數組的所有元素不同。
傳回滿足條件的所有子數組的最大子數組和。如果沒有子數組滿足條件,則回傳0.
子數組是數組中連續的非空元素序列。
範例1:
- 輸入: nums = [1,5,4,2,9,9,9], k = 3
- 輸出: 15
-
解釋:長度為 3 的 nums 的子數組為:
- [1,5,4]符合要求,總和為10。
- [5,4,2]符合要求,總和為11。
- [4,2,9]符合要求,總和為15。
- [2,9,9]不符合要求,因為元素9重複。
- [9,9,9]不符合要求,因為元素9重複。
- 我們回傳 15,因為它是所有滿足條件子數組的最大子數組總和
範例2:
- 輸入: nums = [4,4,4], k = 3
- 輸出: 0
-
解釋:長度為 3 的 nums 的子數組為:
- [4,4,4]不符合要求,因為元素4重複。
- 我們回傳 0,因為沒有 子數組滿足條件。
約束:
- 1 5
- 1 5
提示:
- 從以索引 i 結尾的大小為 k 的子數組移動到以索引 i 1 結尾的大小為 k 的子數組時,哪些元素會改變?
- 只有兩個元素發生變化,i 1 處的元素被加到子數組中,i - k 1 處的元素從子數組中刪除。
- 迭代大小為 k 的每個子數組,並追蹤子數組的總和以及每個元素的頻率。
解:
我們可以按照以下步驟操作:
方法:
- 滑動窗口:窗口大小為k,我們在數組中滑動窗口,同時維護當前窗口的總和並檢查窗口中的所有元素是否不同。
- 雜湊表(或關聯數組):使用關聯數組(雜湊表)來追蹤目前視窗中元素的頻率。如果任何元素出現多次,則該視窗無效。
- 更新視窗:當我們滑動視窗時,新增元素(即進入視窗的元素),並刪除舊元素(即離開視窗的元素)。相應地更新總和並檢查視窗是否有效(即所有元素都是不同的)。
- 回傳最大和:我們需要追蹤有效子數組中遇到的最大和。
演算法:
- 初始化一個雜湊表freq,用於儲存目前視窗中元素出現的頻率。
- 先計算大小為 k 的第一個視窗的總和,如果視窗包含不同元素,則儲存結果。
- 從左向右滑動視窗:
- 刪除左側離開視窗的元素。
- 加入從右側進入視窗的元素。
- 更新總和和雜湊表,並檢查視窗是否仍只包含不同的元素。
- 如果視窗具有有效的不同元素,則更新最大總和。
- 如果沒有找到有效的子數組,則回傳0。
讓我們用 PHP 實作這個解:2461。長度為 K
的不同子數組的最大和
<?php /** * @param Integer[] $nums * @param Integer $k * @return Integer */ function maximumSubarraySum($nums, $k) { ... ... ... /** * go to ./solution.php */ } // Example usage: $nums1 = [1,5,4,2,9,9,9]; $k1 = 3; echo maximumSubarraySum($nums1, $k1); // Output: 15 $nums2 = [4,4,4]; $k2 = 3; echo maximumSubarraySum($nums2, $k2); // Output: 0 ?>
解釋:
-
變數:
- $maxSum:追蹤迄今為止找到的有效子數組的最大和。
- $currentSum:儲存目前大小為k的滑動視窗的總和。
- $freq:雜湊表(或關聯數組),儲存目前視窗中元素的頻率。
-
滑動視窗:
- 我們用循環遍歷數組。當我們移動視窗時,我們:
- 將索引 $i 處的元素加到總和中並更新其頻率。
- 如果視窗大小超過 k,我們從總和中刪除索引 $i - k 處的元素並降低其頻率。
- 我們用循環遍歷數組。當我們移動視窗時,我們:
-
有效視窗檢查:
- 一旦視窗大小達到 k(即,當 $i >= k - 1 時),我們透過確保頻率圖中不同鍵的數量等於 k 來檢查視窗中的所有元素是否不同。如果是,我們會更新最大總和。
-
回傳結果:
- 迭代數組後,我們返回找到的最大總和。如果沒有找到有效的子數組,maxSum 將保持為 0。
時間複雜度:
- O(n),其中 n 是 nums 陣列的長度。每個元素在滑動視窗中新增和刪除一次,雜湊表操作(插入、刪除、檢查計數)平均為 O(1)。
空間複雜度:
- O(k) 為儲存目前視窗中元素出現頻率的雜湊表。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
- 領英
- GitHub
以上是長度為 K 的不同子數組的最大和的詳細內容。更多資訊請關注PHP中文網其他相關文章!

DependencyInjection(DI)inPHPenhancescodeflexibilityandtestabilitybydecouplingdependencycreationfromusage.ToimplementDIeffectively:1)UseDIcontainersjudiciouslytoavoidover-engineering.2)Avoidconstructoroverloadbylimitingdependenciestothreeorfour.3)Adhe

到Improveyourphpwebsite的實力,UsEthestertate:1)emplastOpCodeCachingWithOpcachetCachetOspeedUpScriptInterpretation.2)優化的atabasequesquesquesquelies berselectingOnlynlynnellynnessaryfields.3)usecachingsystemssslikeremememememcachedisemcachedtoredtoredtoredsatabaseloadch.4)

是的,ItispossibletosendMassemailswithp.1)uselibrarieslikeLikePhpMailerorSwiftMailerForeffitedEmailsending.2)enasledeLaysBetenemailstoavoidSpamflagssspamflags.3))

DependencyInjection(DI)inPHPisadesignpatternthatachievesInversionofControl(IoC)byallowingdependenciestobeinjectedintoclasses,enhancingmodularity,testability,andflexibility.DIdecouplesclassesfromspecificimplementations,makingcodemoremanageableandadapt

使用PHP發送電子郵件的最佳方法包括:1.使用PHP的mail()函數進行基本發送;2.使用PHPMailer庫發送更複雜的HTML郵件;3.使用SendGrid等事務性郵件服務提高可靠性和分析能力。通過這些方法,可以確保郵件不僅到達收件箱,還能吸引收件人。

計算PHP多維數組的元素總數可以使用遞歸或迭代方法。 1.遞歸方法通過遍歷數組並遞歸處理嵌套數組來計數。 2.迭代方法使用棧來模擬遞歸,避免深度問題。 3.array_walk_recursive函數也能實現,但需手動計數。

在PHP中,do-while循環的特點是保證循環體至少執行一次,然後再根據條件決定是否繼續循環。 1)它在條件檢查之前執行循環體,適合需要確保操作至少執行一次的場景,如用戶輸入驗證和菜單系統。 2)然而,do-while循環的語法可能導致新手困惑,且可能增加不必要的性能開銷。

在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函數進行快速哈希,但不適合密碼存儲。 2.使用sha256函數提高安全性。 3.使用password_hash函數處理密碼,提供最高安全性和便捷性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

Dreamweaver CS6
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境