ETH官方钱包

前往
大廳
主題

LeetCode - 1675. Minimize Deviation in Array 解題心得

Not In My Back Yard | 2022-09-25 12:00:06 | 巴幣 0 | 人氣 252

題目連結(jié):


題目意譯:
你被給定一由 n 個正整數(shù)的陣列 nums。

你可以在陣列中任意元素上執(zhí)行任意次的以下兩種操作:
如果元素值是偶數(shù),將其除以 2。
例如,如果陣列是 [1,2,3,4],則你可以對最後一個元素執(zhí)行這個操作,使陣列變?yōu)?[1,2,3,2]。
如果元素值是奇數(shù),將其乘以 2。
例如,如果陣列是 [1,2,3,4],則你可以對第一個元素執(zhí)行這個操作,使陣列變?yōu)?[2,2,3,4]。

一陣列的離差(Deviation)被定義為陣列中任兩元素值之差值最大值。

回傳執(zhí)行若干次操作後可以得到的陣列之最小離差值。

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



範例測資:
範例 1:
輸入: nums = [1,2,3,4]
輸出: 1
解釋: 你可以把陣列變?yōu)?[1,2,3,2],然後變?yōu)?[2,2,3,2],則離差值將為 3 - 2 = 1。

範例 2:
輸入: nums = [4,1,5,20,3]
輸出: 3
解釋: 你可以在兩步操作後將陣列變?yōu)?[4,2,5,5,3],則離差值將為 5 - 2 = 3。

範例 3:
輸入: nums = [2,10,8]
輸出: 3


解題思維:
根據(jù)題意,我們可以看到 nums 中值為偶數(shù)的數(shù)字們只可能會變小(變小到變成奇數(shù)為止),不會變大;同時,值為奇數(shù)的數(shù)字們只可能會變大(而且只會變大一次)、不會變小。

因此我們可以先把 nums 中是奇數(shù)的數(shù)字統(tǒng)一乘以 2 變成偶數(shù)。這樣一來便使得 nums 中所有的數(shù)字都只有「變小」的選項,也因此一同最大化了 nums 中的最大、最小值。

而現(xiàn)在可以看到,由於每個數(shù)字都只有「變小」的選擇,因此比起其他數(shù)字我們應選擇讓當前最大的數(shù)字變小。

所以我們就一直挑出當中的最大值使其「變小」(也就是除以 2),直到我們挑到的當前最大值是奇數(shù)為止。然後在每個狀態(tài)中計算出當時的「最大減最小」之值,取出其中最小的即是所求最小離差值。




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

創(chuàng)作回應

更多創(chuàng)作