題目連結:
題目意譯:
你被給定一個索引值從 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。看哪一種所需操作數最小即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。