2762。連續子數組
難度:中
主題:滑動視窗、陣列、有序集、堆疊(優先權佇列)、佇列、單調佇列、兩個指標、有序映射、雜湊表、動態規劃、計數、數學、二元搜尋樹、線段樹、樹、堆疊、二分搜尋、單調堆疊、記憶、迭代器、貪婪、深度優先搜尋、遞歸
給你一個0索引整數數組nums。如果滿足以下條件,則 nums 的子數組稱為連續的:
傳回連續子數組的總數。
子數組是數組中連續的非空元素序列。
範例1:
範例2:
約束:
提示:
解:
我們可以使用滑動視窗技術來高效率計算連續子數組的數量。我們將維護一個有效窗口,其中子數組中的最大值和最小值之差最多為 2。為了有效追蹤目前視窗內的最大值和最小值,我們可以使用兩個 deques (一個一個為最大值,一個為最小值)。
讓我們用 PHP 實作這個解決方案:2762。連續子數組
<?php /** * @param Integer[] $nums * @return Integer */ function continuousSubarrays($nums) { ... ... ... /** * go to ./solution.php */ } // Example usage $nums1 = [5, 4, 2, 4]; echo continuousSubarrays($nums1) . "\n"; // Output: 8 $nums2 = [1, 2, 3]; echo continuousSubarrays($nums2) . "\n"; // Output: 6 ?>
滑動視窗:
只有當視窗無效(即最大值與最小值之差超過2)時,左指標才會向前移動。右指針透過遍歷數組來擴展視窗。
最大值和最小值的雙端隊列:
計算子數組:
對於每個右側,以右側結尾的有效子數組的數量等於(右 - 左 1),因為從左到右的所有子數組都是有效的。
效率:
每個元素最多會加入雙端佇列或從雙端佇列中刪除一次,使得時間複雜度 O(n)。由於雙端隊列,空間複雜度為 O(n)。
8 6
時間複雜度:
空間複雜度:
此實作非常高效,並且在提供的約束範圍內工作。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
以上是連續子數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!