題目連結:
題目意譯:
給定一陣列 nums,將其一分為二(連續(xù)地)成兩個子陣列 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 最小值」。
因此我們可以定義三個變數(shù) partitionAt 、 leftMaximum 和 nowGlobalMaximum,依序代表著 left 最右的元素索引值、left 最大值以及當前掃到的數(shù)字中的最大值。
因為 left 至少要有一個數(shù)字,所以一開始 partitionAt = 0、leftMaximum = nowGlobalMaximum = nums[0](因為 nums[0] 屬於 left)。
接著我們從 nums[1] 掃到 nums 的結尾。當我們在 nums[i] 時,如果 nums[i] ≧ leftMaximum,則代表 nums[i] 這個「目前」可以放在右側(cè)(因為大於左側(cè)最大值),因此更新 nowGlobalMaximum 為 max(nowGlobalMaximum, nums[i]);而如果 nums[i] < leftMaximum 則代表著 nums[i] 位於 right 將會使條件不符合,因此 nums[i] 應包含於 left。而一旦將 nums[i] 放入 left,則 leftMaximum 到 nums[i] 中間經(jīng)過的數(shù)字也通通需要進去。因此更新 partitionAt 為 i、leftMaximum 為 nowGlobalMaximum。
而最後所求 left 之長度即為 partitionAt + 1。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。