別具一格 讓所有數字都相異的最少加法操作 Min Increment Make Array Unique_LC#945

閱讀時間約 4 分鐘

題目敘述 Minimum Increment to Make Array Unique

給定一個整數陣列,每回合可以任意挑一個數字進行+1的加法操作。
請問最少需要多少次的+1加法操作,才能讓每個數字都相異?


測試範例

Example 1:

Input: nums = [1,2,2]
Output: 1
Explanation: After 1 move, the array could be [1, 2, 3].

2 調整成 3
需要一次加法操作。​

Example 2:

Input: nums = [3,2,1,2,1,7]
Output: 6
Explanation: After 6 moves, the array could be [3, 4, 1, 2, 5, 7].
It can be shown with 5 or less moves that it is impossible for the array to have all unique values.

1 調整成 2
第一個2 調整成 3
第二個2 調整成 4
3 調整成 5

總共需要六次加法操作。​

約束條件

Constraints:

  • 1 <= nums.length <= 10^5

陣列長度介於1~十萬。

  • 0 <= nums[i] <= 10^5

每個陣列元素介於1~十萬。


觀察

每個整數都要相異,相當於把重複的整數重新mapping到更大的整數
而且為了讓加法操作數目越少越好,重新mapping的距離越近越好,也就是離自己越近越好


這個過程就相當於hash function中的線性探測linear probing,遇到碰撞時,
重新往右側尋找空的格子,每次往右找一格,一直找到空格子為止


演算法 線性探測

維護一張hash table,儲存每個整數對應到的格子點。

最理想的情況是 x -> x,映射到原本的位置,這樣就不需要額外加法。

假如遇到碰撞時,也就是重複的整數,往右側尋找空的格子,找到之後,把原本重複的x映射到右側離自己最近的整數,並且計算對應的+1加法操作次數。


程式碼 線性探測

class Solution(object):
def minIncrementForUnique(self, nums):

# Linear probing to find vacant index in grid
def findVacant(number, grid):

vacantIndex = grid[number]
if vacantIndex == -1:
grid[number] = number
return number

vacantIndex = findVacant(vacantIndex + 1, grid)
grid[number] = vacantIndex
return vacantIndex
# ------------------------------------------------

# index: integer
# value: index of vacant grid
grid = defaultdict(lambda :-1)
incOperation = 0
for number in nums:
vacantIndex = findVacant(number, grid)
incOperation += vacantIndex - number

return incOperation

複雜度分析

時間複雜度:O(n)

線性掃描每個整數,每個整數可以在常數時間內找到空的格子。


空間複雜度: O(n)

需要一個Hash table來儲存每個整數被映射到的格子點。


關鍵知識點

每個整數都要相異,相當於把重複的整數重新mapping到更大的整數

而且為了讓加法操作數目越少越好,重新mapping的距離越近越好,也就是離自己越近越好


這個過程就相當於hash function中的線性探測linear probing,遇到碰撞時,

重新往右側尋找空的格子,每次往右找一格,一直找到空格子為止


Reference

[1] Minimum Increment to Make Array Unique - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
EXCEL 如何依據相同類別建立相同的流水編號或序號建立序號或稱流水號情境百百種,今天的情境是,相同類別建立相同的流水編號或序號,這樣的序號如何快速建立呢? 其實用對函數,不用30秒就解決了!!!先花1分鐘看一下教學影片吧,觀看影片之前可以先下載檔案,學中做、做中學效果最好唷。(文末有函數說明) 檔案下載 函數說明 ✍🏾COUNTIF有
Thumbnail
avatar
效率職人
2023-09-17
EXCEL 如何依據不同類別分別建立序號或流水號建立序號或稱流水號情境百百種,今天的情境是,不同組別序號就要重新編列,這樣的序號如何快速建立呢? 其實用對函數,不用30秒就解決了!!!先花1分鐘看一下教學影片吧,觀看影片之前可以先下載檔案,學中做、做中學效果最好唷。(文末有函數說明) 檔案下載 函數說明 ✍🏾COUNTIF有條件計數
Thumbnail
avatar
效率職人
2023-09-13
#幻蝶蔓(Adenia glauca),一種別具風格的塊根植物,近年來成為塊根迷熱門收藏品幻蝶蔓(Adenia glauca)有著木頭般塊莖,藤蔓狀枝條,枝蔓上的葉子形似蝴蝶,在微風中翩翩起舞,這種別具風格的塊根植物,近年來更成為塊根迷爭先收藏的熱門品種。由於網路上較難找到相關植物的種植資訊,因此,小編對有限的信息作一整理,以便有興趣的朋友參考。
Thumbnail
avatar
林佑
2023-04-21
100-12成果,是別人評價你過程多努力的依據。我從來沒有跟學生講過「過程比成績重要」,或是「成績不重要,過程比較重要」的話。因爲,成績就是自己努力過程的展現,大家不會看到你努力準備的過程,但是當你拿到高分的成績,會因爲你的成績而肯定你的努力。所以,不要再有「過程比結果重要」的迷思,應該要把兩者列在同等重要的位置,甚至有時候,結果還會比過程重要!
avatar
徐曉梅
2022-12-06
釀影評|《別擔心親愛的》:萬事俱備但缺了一位劇本醫生魏爾德對電影視覺與風格是頗具野心的,《別擔心親愛的》透露出她能駕馭更複雜的調度、更強烈的特色,但或許就是太著重於此,也或許與電影本身無關的各種事件造成分心,讓她忽略整體劇本的架構與節奏。尤其教人扼腕的是,電影尾聲在聲音及影像的氣勢方面,幾乎要堆疊出喬登.皮爾等級的高潮,但劇情本身的問題讓一切洩了氣。
Thumbnail
avatar
Lizzy
2022-09-29
閱讀心得|獨特、別具一格或許是更好的生存之道 《小眾,其實不小》 「討好所有人」聽起來像是個近乎不可能的事情,但我們卻時刻想這麼做,因為在我們心裡,都覺得受大家喜愛是最好的權衡之術,但真的是這樣嗎? 新文化生態體系 族群劃分的方式改變 星巴克、HBO、新聞不中立 總結
Thumbnail
avatar
維克絲
2022-09-01
黃偉哲請別用單一數據,掩飾你執政的無能 黃偉哲請別用單一數據,掩飾你執政的無能 出動網軍、側翼秀下限,只為了蹭聲量?何必呢? 請問黃偉哲市長,當衛生局跟你說我們的疫苗剩餘率六都最少時,你別急著自嗨,更別出動支持者,側翼及網軍們特別幫你黃偉哲製圖po文,並四處散播讓人誤解的訊息!你這樣不就是最不要臉的網路蟑螂嗎? 1.六都第一疫苗剩餘率
avatar
政客們的幹話週記
2021-07-13
【影劇】小太郎一個人生活。恰如其分的漫畫改編作(橫山裕推別錯過)Netflix從兩個月前每周五更新的日劇《小太郎一個人生活》,是從漫畫改編的真人影劇作品。漫畫改編作品向來有崩壞風險,嘗試看到最新的第7集後(6/11),覺得角色還原度和改編程度都有固定水準,也許不是很主流的題材或超高規格製作,然而作為每周五的輕鬆收尾,個人覺得恰如其分。
Thumbnail
avatar
Hotaru ▏Mystery
2021-06-12
帶你一窺服裝設計師的家!別具風味的俐落混搭風 座落地點:桃園市 桃園區空間類型:住家房屋狀況:老屋空間坪數:35坪空間格局:1房2廳2衛設計風格:混搭風裝潢費用:300萬台幣 (不含:家具、家電、冷氣)使用建材:超耐磨地板、天然木皮、進口系統板、乳膠漆、鐵件家庭成員:大人x2 本文章內容及圖片均由本專欄作者提供及上載
avatar
YingYing824
2020-05-11
帶你一窺服裝設計師的家!別具風味的俐落混搭風 座落地點:桃園市 桃園區空間類型:住家房屋狀況:老屋空間坪數:35坪空間格局:1房2廳2衛設計風格:混搭風裝潢費用:300萬台幣 (不含:家具、家電、冷氣)使用建材:超耐磨地板、天然木皮、進口系統板、乳膠漆、鐵件家庭成員:大人x2 本文章內容及圖片均由本專欄作者提供及上載,並不代
avatar
YingYing824
2020-05-08