ETH官方钱包

前往
大廳
主題

LeetCode - 2444. Count Subarrays With Fixed Bounds 解題心得

Not In My Back Yard | 2023-09-08 12:00:13 | 巴幣 0 | 人氣 265

題目連結:


題目意譯:
你被給定一整數陣列 nums 以及兩整數 minK 和 maxK。

nums 的一個固定邊界(Fixed-Bound)子陣列為一個滿足以下條件的子陣列:
該子陣列中的最小值等於 minK、
該子陣列中的最大值等於 maxK。

回傳固定邊界子陣列的數量。

一個子陣列為一陣列的一個連續部分。

限制:
2 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i], minK, maxK ≦ 10 ^ 6



範例測資:
範例 1:
輸入: nums = [1,3,5,2,7,5], minK = 1, maxK = 5
輸出: 2
解釋: 固定邊界子陣列為 [1,3,5] 和 [1,3,5,2]。

範例 2:
輸入: nums = [1,1,1,1], minK = 1, maxK = 1
輸出: 10
解釋: nums 中每一個子陣列都是固定邊界子陣列。總計有 10 個可能的子陣列。


解題思維:
假設我們想要先求對於 i 來說最遠可以往左延伸到何處,稱其為 j + 1,代表著一旦延伸到 nums[j](其中 nums[j] < minK 或 maxK < nums[j]),該子陣列就不是固定邊界了(如果 nums[i] 本身就超出 [minK, maxK] 邊界的話,就直接完全忽略這個索引值)。

而如果我們知道 nums[j + 1] ~ nums[i] 之中最後一個(即最靠右)最小值在的位置 m 以及最後一個最大值在的位置 M,則我們可以從 min(M, m) 延伸到 j + 1 為止。因為 nums[min(M, m)] ~ nums[i] 會是以 nums[i] 作為結尾的最短固定邊界子陣列,而 nums[j + 1] ~ nums[i] 則是最長者。

也就是說假設對於每個索引值 i,我們都知道著最後一個位置 j(即索引值盡可能地大),其滿足 nums[j] < minK 或 maxK < nums[j]。並且同時知道兩個索引值 M 和 m,其滿足 M > j 且 m > j 且 nums[j] ~ nums[i] 中的最小值為 nums[m] 而最大值為 nums[M] 且 m 和 M 盡可能大。

則以 i 作為結尾的固定邊界子陣列之數量為 min(M, m) - j。



而相鄰索引值 i 到 i + 1 之間的 m 、 n 、 j 實際上是可以互推的:
如果 nums[i + 1] 本身就超出 [minK, maxK] 邊界的話,則忽略先前的所有索引值,畢竟不可能有固定邊界子陣列以此作為結尾;

如果 nums[i] 才是超出範圍者,而 nums[i + 1] 有在範圍內,則 M = m = i + 1 而 j = i;

以上皆非,則判斷 nums[i] 的數值:
    如果 nums[i] 恰好是 minK,則 m = i,其餘不變。
    如果 nums[i] 恰好是 maxK,則 M = i,其餘不變。



因此最後我們只要從索引值 0 往後推然後算出以每個索引值 i 作為結尾的固定邊界子陣列之數量,然後把這些數量加總即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作