題目連結:
題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums 以及一整數 value。
在一次操作中,你可以從 nums 中的任一元素「加上」或是「減去」value。
例如說,如果 nums = [1,2,3] 而 value = 2,你可以選擇從 nums[0] 減去 value 來得到 nums = [-1,2,3]。
一個陣列的 MEX(Minimum EXcluded)值為在不存在於其中的最小非負整數。
例如說,[-1,2,3] 的 MEX 為 0,而 [1,0,3] 的 MEX 為 2。
回傳執行任意次數的上述操作後,nums 最大的 MEX 之值。
限制:
1 ≦ nums.length, value ≦ 10 ^ 5
-10 ^ 9 ≦ nums[i] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: nums = [1,-10,7,13,6,8], value = 5
輸出: 4
解釋: 我們可以藉由以下操作得到此結果:
- 將 nums[1] 加上 value 兩次來令 nums = [1,0,7,13,6,8]
- 將 nums[2] 減去 value 一次來令 nums = [1,0,2,13,6,8]
- 將 nums[3] 減去 value 兩次來令 nums = [1,0,2,3,6,8]
nums 的 MEX 為 4??梢宰C明 4 是我們可以達成的最大 MEX 值。
範例 2:
輸入: nums = [1,-10,7,13,6,8], value = 7
輸出: 2
解釋: 我們可以藉由以下操作得到此結果:
- 將 nums[2] 減去 value 一次來令 nums = [1,-10,0,13,6,8]
nums 的 MEX 為 2??梢宰C明 2 是我們可以達成的最大 MEX 值。
解題思維:
首先,我們可以看到如果有一個元素值除以 value 得到的餘數是 r,則該元素經過若干次加上或減去 value 的操作後可以變成 r 、 r + value 、 r - value 、 r + 2 × value 、 r - 2 × value 、……。但是絕對無法變成 r + value + 1 、 r + value - 1 等等。除非 value 剛好是 1,此情況下所有數字可以變成任何數字。
因此我們可以用一個陣列 C 來統計 nums 中每一種餘數各有多少(不過範例程式碼中是使用雜湊表(Hash Table)來存,但道理一樣)。
例如在範例測資一中,我們可以得到一個統計陣列 C 為 [1,2,1,2,0] 代表著:
餘數 0 有 1 個、
餘數 1 有 2 個、
餘數 2 有 1 個、
餘數 3 有 2 個、
餘數 4 有 0 個。
有了這個之後,我們便可以從 0 開始往上數。每當我們數到數字 i 時,算出其除以 value 的餘數 r。然後去看 C[r] 是否為 0。如果不為 0,則代表著我們可以利用這個餘數也為 0 的「某個」元素來使其變成數字 i(所需操作次數不重要,重要的是我們做得到)。由於這個元素負責數字 i,因此要將 C[r] 減去 1。
而如果碰到 C[r] 為 0 的情況,則代表 nums 中已經沒有元素(或是本來就沒有)可以將其變為 i。因此此時數到的數字 i 就是題目所求的最大 MEX 值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。