ETH官方钱包

前往
大廳
主題

LeetCode - 2811. Check if it is Possible to Split Array 解題心得

Not In My Back Yard | 2024-10-25 12:00:13 | 巴幣 2 | 人氣 44

題目連結:


題目意譯:
你被給定一個長度 n 的陣列 nums 以及一整數 m。你需要判斷是否可以藉由一系列的操作使該陣列分拆成 n 個大小為 1 的陣列。

一個陣列如果滿足以下條件之一,則該陣列是「好的」:
    陣列長度為 1,或是
    陣列中元素總和大於等於 m。

在每一步中,你可以選擇一個現存的且長度至少為 2 的陣列(可能會是前幾次的產物)並滿足將其分拆成兩個陣列後,兩陣列都是好的陣列。

如果你可以將給定的陣列分拆成 n 個陣列,則回傳真(True);反之回傳假(False)。

限制:
1 ≦ n == nums.length ≦ 100
1 ≦ nums[i] ≦ 100
1 ≦ m ≦ 200



範例測資:
範例 1:
輸入: nums = [2, 2, 1], m = 4
輸出: true
解釋:
將 [2, 2, 1] 分切成 [2, 2] 和 [1]。陣列 [1] 長度為 1,而陣列 [2, 2] 有著元素總和值 4 ≧ m,所以都是好的陣列。
將 [2, 2] 分切成 [2] 和 [2]。兩個陣列長度都是 1,所以都是好的陣列。

範例 2:
輸入: nums = [2, 1, 3], m = 5
輸出: false
解釋:
第一步必須是以下其中一個:
將 [2, 1, 3] 分切成 [2, 1] 和 [3]。陣列 [2, 1] 長度不為 1,而總和值也沒有大於等於 m。
將 [2, 1, 3] 分切成 [2] 和 [1, 3]。陣列 [1, 3] 長度不為 1,而總和值也沒有大於等於 m。
所以兩種方式都不合法(沒有陣列分切成兩個好的陣列),因此我們無法將 nums 分切成 n 個大小為 1 的陣列。

範例 3:
輸入: nums = [2, 3, 3, 2, 3], m = 6
輸出: true
解釋:
將 [2, 3, 3, 2, 3] 分切成 [2] 和 [3, 3, 2, 3]。
將 [3, 3, 2, 3] 分切成 [3, 3, 2] 和 [3]。
將 [3, 3, 2] 分切成 [3, 3] 和 [2]。
將 [3, 3] 分切成 [3] 和 [3]。


解題思維:
(令 n = nums.length)
首先如果 n ≦ 2,則結果必定為真(要嘛本來長度就是 1 的陣列,要嘛就是唯一一種切法是直接切成兩個長度 1 的陣列)。



因此接下來都是 n > 2 的情況。

很明顯地,如果 nums 中有一段子陣列的總和值大於等於 m(假設其為 nums[L] ~ nums[R]),那麼我們至少可以把 nums[0] ~ nums[L - 1] 和 nums[R + 1] ~ nums[n - 1] 都分切成長度 1 的陣列(因為只要一次切一個數字出去即可,兩個陣列必定都是好的)。

如果這段子陣列 nums[L] ~ nums[R] 越短,我們就越接近目標。而一旦 L + 1 == R 時,也就是存在某個 i 值滿足 nums[i] + nums[i + 1] ≧ m 時,我們便可以將 nums 切成 n 個長度 1 的陣列。

並且,我們可以看到實際上上面的敘述滿足「若且唯若」的性質。即「可以將 nums 切成 n 個長度 1 的陣列」必定代表著 nums 存在著上述的 i 值。

為何?很簡單,因為「最後一步」無論如何都會剩下至少一個長度 2 的陣列,而已知原先的長度(即 n 值)大於 2,因此我們必須要合法地切出這個長度 2 的陣列。而根據題目定義,這個陣列必須滿足總和值大於等於 m。故命題成立。



因此只要特別判斷掉 n ≦ 2 的情況後,掃過一次 nums 看有無存在符合上述條件的 i 值。如果有,則回傳真;反之,則回傳假。




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

0則留言

追蹤 創作集

作者相關創作

更多創作