前往
大廳
主題

LeetCode - 915. Partition Array into Disjoint Intervals 解題心得

Not In My Back Yard | 2021-11-29 00:00:04 | 巴幣 0 | 人氣 230

題目連結:


題目意譯:
給定一陣列 nums,將其一分為二(連續地)成兩個子陣列 left 和 right 使其滿足:
每個 left 中的元素小於等於每個 right 中的元素。
left 和 right 為非空。
left 有著盡可能地小之大小。

回傳此般分割之最小可能 left 之長度。保證至少存在一個可行分割。

注:
2 ≦ nums.length ≦ 30000
0 ≦ nums[i] ≦ 10 ^ 6
保證至少有一個方式可以將 nums 按照敘述分割。



範例測資:
範例 1:
輸入: nums = [5,0,3,8,6]
輸出: 3
解釋: left = [5,0,3], right = [8,6]

範例 2:
輸入: nums = [1,1,1,0,6,12]
輸出: 4
解釋: left = [1,1,1,0], right = [6,12]


解題思維:
可以看到「每個 left 中的元素小於等於每個 right 中的元素」這個敘述等價於「left 最大值 ≦ right 最小值」。

因此我們可以定義三個變數 partitionAt 、 leftMaximum 和 nowGlobalMaximum,依序代表著 left 最右的元素索引值、left 最大值以及當前掃到的數字中的最大值。

因為 left 至少要有一個數字,所以一開始 partitionAt = 0、leftMaximum = nowGlobalMaximum = nums[0](因為 nums[0] 屬於 left)。

接著我們從 nums[1] 掃到 nums 的結尾。當我們在 nums[i] 時,如果 nums[i] ≧ leftMaximum,則代表 nums[i] 這個「目前」可以放在右側(因為大於左側最大值),因此更新 nowGlobalMaximum 為 max(nowGlobalMaximum, nums[i]);而如果 nums[i] < leftMaximum 則代表著 nums[i] 位於 right 將會使條件不符合,因此 nums[i] 應包含於 left。而一旦將 nums[i] 放入 left,則 leftMaximum 到 nums[i] 中間經過的數字也通通需要進去。因此更新 partitionAt 為 i、leftMaximum 為 nowGlobalMaximum。

而最後所求 left 之長度即為 partitionAt + 1。




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

創作回應

更多創作