LeetCode每日一題 使陣列唯一的最小增量

2021-10-04 06:08:49 字數 1166 閱讀 8770

給定整數陣列 a,每次 move 操作將會選擇任意 a[i],並將其遞增 1。

返回使 a 中的每個值都是唯一的最少操作次數。

示例 1:

輸入:[1,2,2]

輸出:1

解釋:經過一次 move 操作,陣列將變為 [1, 2, 3]。

示例 2:

0 <= a.length <= 40000

0 <= a[i] < 40000

先對陣列進行從小到大的排序,然後依次判斷後乙個元素如果小於等於前乙個,則將後面的元素變為前乙個元素+1大小,將二者的差累加起來,到最後乙個元素後則算出最小的move操作。

class

solution

}return move;}}

;

首先統計出每個數出現的次數,然後從小到大遍歷每個數 x:

如果 x 出現了兩次以上,就將額外出現的數記錄累加;

如果 x 沒有出現過,那麼在記錄下來的數中選取乙個 v,將它增加到 x,需要進行的操作次數為 x - v。

還是以 [1, 1, 1, 1, 3, 5] 為例,當我們發現有 3 個重複的 1 時,我們先將操作次數減去 1 + 1 + 1。接下來,當我們發現 2,4 和 6 都沒有出現過時,我們依次將操作次數增加 2,4 和 6。

注意事項

雖然 a[i] 的範圍為 [0, 40000),但我們有可能會將資料遞增到 40000 的兩倍 80000。這是因為在最壞情況下,陣列 a 中有 40000 個 40000,這樣要使得陣列值唯一,需要將其遞增為 [40000, 40001, …, 79999],因此用來統計的陣列需要開到 80000。

class

solution

;for

(int x: a) cnt[x]++;

int ans =

0, taken =0;

for(

int x =

0; x <

80000

;++x)

else

if(taken >

0&& cnt[x]==0

)}return ans;}}

;

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...