ETH官方钱包

前往
大廳
主題

LeetCode - 2740. Find the Value of the Partition 解題心得

Not In My Back Yard | 2024-08-30 12:00:07 | 巴幣 0 | 人氣 23

題目連結:


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

將 nums 分切成兩個陣列 nums1 和 nums2,使得:
    陣列中每一個元素要嘛屬於 nums1、要嘛屬於 nums2、
    兩個陣列皆非空、
    分切值最小化。

分切值定義為 |max(nums1) - min(nums2)|。

這邊,max(nums1) 代表著陣列 nums1 中的最大元素。而 min(nums2) 代表著陣列 nums2 中的最小元素。

回傳一個整數代表著符合上述條件的分切值。

限制:
2 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9



範例測資:
範例 1:
輸入: nums = [1,3,2,4]
輸出: 1
解釋: 我們可以將陣列 nums 分切成 nums1 = [1,2] 及 nums2 = [3,4]。
- 陣列 nums1 中最大元素為 2。
- 陣列 nums2 中最大元素為 3。
分切值為 |2 - 3| = 1。
可以證明 1 是所有可能的分切中的最小值。

範例 2:
輸入: nums = [100,1,10]
輸出: 9
解釋: 我們可以將陣列 nums 分切成 nums1 = [10] 及 nums2 = [100,1]。
- 陣列 nums1 中最大元素為 10。
- 陣列 nums2 中最大元素為 1。
分切值為 |10 - 1| = 9。
可以證明 9 是所有可能的分切中的最小值。


解題思維:
可以看到不管最佳解長怎樣,一定可以重新分切成以下形式:
    max(num1) 和 min(num2) 各自保持不變、
    其他數字只要 ≦ max(nums1),則統一分到 nums1 中、
    其他數字只要 ≧ min(nums2),則統一分到 nums2 中。
    (而如果 nums1 == nums2,則等於它們的數字隨便分都可以)。

因此最後如果把 nums1 中由小到大列舉出來,再將 nums2 中的數字由小到大列舉出來。則可以看到其所形成的序列正是排序後的 nums,而 max(nums1) 和 min(nums2) 則作為「分界點」存在。

因此我們可以窮舉這樣子的「分界點」,也就是說對 nums 排序之後窮舉所有 nums[i] - nums[i - 1] 之值(0 < i < nums.length),其中的最小值即為所求(因為如上所述,最佳解的分切值必定存在於其中)。




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

創作回應

更多創作