前往
大廳
主題

LeetCode - 2170. Minimum Operations to Make the Array Alternating 解題心得

Not In My Back Yard | 2022-09-22 12:00:13 | 巴幣 0 | 人氣 142

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的陣列 nums,其由 n 個正整數所組成。

陣列 nums 被稱為交錯的,如果以下條件符合:
nums[i - 2] == nums[i],其中 2 ≦ i ≦ n - 1。
nums[i - 1] != nums[i],其中 1 ≦ i ≦ n - 1。

在一次操作中,你可以選擇一個索引值 i 並將 nums[i] 變為任意正整數。

回傳最少所需操作數使得陣列變為交錯的。

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



範例測資:
範例 1:
輸入: nums = [3,1,3,2,4,3]
輸出: 3
解釋:
其中一個將陣列變為交錯的方式為將其變成 [3,1,3,1,3,1]。
這個例子中所需的操作數為 3。
可以證明出不可能可以小於 3 次操作內將陣列變成交錯的。

範例 2:
輸入: nums = [1,2,2,2,2]
輸出: 2
解釋:
其中一個將陣列變為交錯的方式為將其變成 [1,2,1,2,1]。
這個例子中所需的操作數為 2。
注意到陣列不能變為 [2,2,2,2,2]。因為這個情況下 nums[0] == nums[1],其違反了交錯陣列的條件。


解題思維:
可以看到題意基本上就是把奇數索引值的數字都變一樣、偶數索引值的數字變成另一樣,而所有數字不能相同。

因此我們可以先把 nums 中的數字分成奇數、偶數索引值各一群。然後把每一群各自排序,然後去找各自哪兩種數字最常出現(如果某一群已經是同一種數字,則只會有不變跟整體一起變兩種結果,所以不會影響等下的結論)。

假設奇數那一群前兩個最常出現的數字為 w 和 x;而偶數的那一群則是 y 和 z。則:
先判斷 w 和 y 是否相同。如果不相同,則表示我們可以把奇數那一群統一變成 w,所需操作數就是「此群總數字量」減去「w 的數量」;然後對偶數做類似的事情,也就是統一變成 y,所需操作數為「該群總數字量」減去「y 的數量」。兩群的所需操作數加總即是所求。

如果 w 和 y 相同,則某一群需要妥協去替換成其第二常出現的。因此我們會有兩種選擇——一種是奇數統一變 w 、偶數統一變 z;另一種則是奇數統一變 x 、偶數統一變 y。看哪一種所需操作數最小即是所求。




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

創作回應

更多創作