前往
大廳
主題

LeetCode - 1498. Number of Subsequences That Satisfy the Given Sum Condition 解題心得

Not In My Back Yard | 2023-03-24 12:00:01 | 巴幣 1000 | 人氣 282

題目連結:


題目意譯:
你被給定一整數陣列 nums 以及一整數 target。

回傳 nums 中非空子序列之數量,使得每個子序列中最小與最大元素之總和小於等於 target。由於答案可能會太大,將其模 10 ^ 9 + 7 後再回傳。

限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 6
1 ≦ target ≦ 10 ^ 6



範例測資:
範例 1:
輸入: nums = [3,5,6,7], target = 9
輸出: 4
解釋: 有 4 個子序列滿足條件。
[3] -> 最小值 + 最大值 ≦ target (3 + 3 ≦ 9)
[3,5] -> (3 + 5 ≦ 9)
[3,5,6] -> (3 + 6 ≦ 9)
[3,6] -> (3 + 6 ≦ 9)

範例 2:
輸入: nums = [3,3,6,8], target = 10
輸出: 6
解釋: 有 6 個子序列滿足條件(nums 可以有重複的數字)。
[3] 、 [3] 、 [3,3] 、 [3,6] 、 [3,6] 、 [3,3,6]

範例 3:
輸入: nums = [2,3,3,4,6,7], target = 12
輸出: 61
解釋: 總共有 63 個非空子序列,其中兩個不滿足條件([6,7] 、 [7])。
合法子序列之數量為 (63 - 2 = 61)。


解題思維:
(令 nums 有著 n 個數字)
先將 nums 由小排到大,現在 nums[0] 為最小值、nums[n - 1] 為最大值。

接著用昨天提及的雙指標(Two Pointers),令 i = 0 、 j = n - 1:
為了求出對於每個 i 值,找到最大的 j 值滿足 i ≦ j 且 nums[i] + nums[j] ≦ target,因此我們就判斷 nums[i] + nums[j] 現在與 target 的大小關係。

如果大過 target 就把 j 減去 1。重複此過程直到 ≦ target 或是 i > j 為止。

找到上述的 j 值之後,可以看到 nums[i + 1] ~ nums[j] 中的數字隨便挑然後與 nums[i] 形成子序列(儘管這是排序後的 nums,但是排序後的子序列與原先的一一對應,不多也不少)後都會滿足最大值 + 最小值 ≦ target。而這樣子的子序列(必定包含 nums[i] 者)將會有
2 ^ (j - i)
個。而這個次方值可以預先建表或是利用快速冪來求得。

把每一個 i 值的結果求總即是所求。




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

創作回應

更多創作