[Swift]LeetCode945. 使数组唯一的最小增量 | Minimum Increment to Make Array Unique

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10015200.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Given an array of integers A, a move consists of choosing any A[i], and incrementing it by 1.

Return the least number of moves to make every value in A unique.

 Example 1:

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

Example 2:

Input: [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.

 Note:

  1. 0 <= A.length <= 40000
  2. 0 <= A[i] < 40000

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1

返回使 A 中的每个值都是唯一的最少操作次数。

示例 1:

输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。

示例 2:

输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

提示:

  1. 0 <= A.length <= 40000
  2. 0 <= A[i] < 40000

424ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         var dp = [Int](repeating: 0, count: 40001)
 4         for a in A {
 5             dp[a] += 1
 6         }
 7         var ans = 0
 8         for i in 0 ..< 40000 {
 9             let a = dp[i]
10             guard a > 1 else {
11                 continue
12             }
13             dp[i] = 1
14             ans += a-1
15             dp[i+1] += a-1
16         }
17         if dp[40000] > 1 {
18             let a = dp[40000] - 1
19             for i in 1 ... a {
20                 ans += i
21             }
22         }
23         return ans
24     }
25 }

440ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         guard A.count > 1 else {
 4             return 0
 5         }
 6         let upperBound = 80001
 7         var freqArray = Array<Int>(repeating: 0, count: upperBound)
 8         for val in A {
 9             freqArray[val] += 1
10         }
11         
12         var ans = 0
13         var numsOfDupTaken = 0
14         for i in 0 ..< upperBound {
15             let count = freqArray[i]
16             if count > 1 {
17                 numsOfDupTaken += count - 1
18                 ans -= i * (count - 1)
19             } else if numsOfDupTaken > 0 && freqArray[i] == 0 {
20                 ans += i
21                 numsOfDupTaken -= 1
22             }
23         }
24         
25         return ans
26     }
27 }

460ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         var count = [Int](repeating: 0, count:100000)
 4         for x in A {
 5             count[x] += 1
 6         }
 7         var ans = 0, taken = 0
 8         for x in 0..<100000 {
 9             if (count[x] >= 2) {
10                 taken += count[x] - 1;
11                 ans -= x * (count[x] - 1);
12             }
13             else if (taken > 0 && count[x] == 0) {
14                 taken -= 1;
15                 ans += x;
16             }
17         }
18         return ans;
19     }
20 }

476ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         guard A.count > 1 else {
 4             return 0
 5         }
 6         let sortedA = A.sorted()
 7         var result = 0, prev = sortedA[0]
 8         for i in 1..<sortedA.count {
 9             if sortedA[i] <= prev {
10                 prev += 1
11                 result += (prev - sortedA[i])
12             } else {
13                 prev = sortedA[i]
14             }
15         }
16         return result
17     }
18 }

484ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         guard A.count > 1 else {
 4             return 0
 5         }
 6         var sortedA = A.sorted()
 7         var counter = 0
 8         for i in 1...sortedA.count - 1 {
 9             if sortedA[i] <= sortedA[i-1] {
10                 counter += sortedA[i-1] + 1 - sortedA[i]
11                 sortedA[i] = sortedA[i-1] + 1
12             }
13         }
14         return counter
15     }
16 }

508ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         var arr:[Int] = A.sorted(by:<)
 4         var r:Int = -1
 5         var ret:Int = 0
 6         for i in 0..<arr.count
 7         {
 8             var to:Int = max(r,arr[i])
 9             ret += abs(to - arr[i])
10             r = to + 1
11         }
12         return ret
13     }
14 }

 552ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3     
 4         var counts = A.reduce(into: [:]) { dict, val in
 5             dict[val, default: 0] += 1
 6         }
 7 
 8         var increments = 0
 9         var nextPossibleSlot = -1
10         for key in counts.keys.sorted() {
11             var keyCount = counts[key]!
12             while keyCount > 1 {
13                 nextPossibleSlot = max(key, nextPossibleSlot) + 1
14                 while counts[nextPossibleSlot] != nil {
15                     nextPossibleSlot += 1
16                 }
17                 //Now nextPossibleSlot is available
18                 counts[nextPossibleSlot] = 1 //not actually necessary
19                 increments += nextPossibleSlot - key
20                 keyCount -= 1
21             }
22         }
23 
24         return increments
25     }
26 }

592ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3         guard A.count > 0 else { return 0 }
 4         guard A.count > 1 else { return 0 }
 5         
 6         var sortA = A.sorted()
 7         var mapA: [Int: Int] = [:]
 8         for a in A {
 9             mapA[a] = (mapA[a] ?? 0) + 1
10         }
11         var res = 0
12         var emptIter = sortA.first! - 1
13         for (index, a) in sortA.enumerated() {
14             if a > emptIter + 1 {
15                 emptIter = emptIter + 1
16                 break
17             }
18             emptIter = a
19         }
20         if emptIter == sortA.last! {
21             emptIter += 1
22         }
23         
24         //print(sortA, emptIter)
25         var prev = -1
26         for (index, a) in sortA.enumerated() {
27             if prev == a {
28                 if emptIter <= a {
29                     emptIter = a
30                     while mapA[emptIter] != nil {
31                         emptIter += 1
32                     } 
33                 }
34                 res += (emptIter - a)
35                 emptIter += 1
36                 while mapA[emptIter] != nil {
37                     emptIter += 1
38                 } 
39                 //print(res, emptIter)
40             }
41             prev = a
42         }
43         
44         return res
45     }
46 }

608ms

 1 class Solution {
 2     
 3     func minIncrementForUnique(_ arr: [Int]) -> Int {
 4         guard arr.count > 1 else {
 5             return 0
 6         }        
 7 
 8         let arr = arr.sorted()
 9         var nextHighestValue = arr[0] + 1
10         var result = 0
11         for i in 1..<arr.count {
12             let value = arr[i]
13             result += max(nextHighestValue - value, 0)
14             nextHighestValue = max(value, nextHighestValue) + 1
15         }
16 
17         return result
18     }
19 }

612ms

 1 class Solution {
 2     func minIncrementForUnique(_ A: [Int]) -> Int {
 3 
 4         if A.count <= 1 {
 5             return 0
 6         }
 7         let a = A.sorted()
 8         var ind0 = 1
 9         var curMin = a[0]
10         var counter = 0
11         while ind0 < a.count {
12             if a[ind0] <= curMin {
13                 curMin += 1
14                 counter += curMin - a[ind0]
15             } else {
16                 curMin = max(a[ind0], curMin)
17             }
18             ind0 += 1
19         }
20         return counter
21     }
22 }

772ms

 1 class Solution {
 2      func minIncrementForUnique(_ A: [Int]) -> Int {
 3         var dict: [Int:Node] = [:]
 4         var count = 0
 5         
 6         for num in A {
 7             if dict[num] == nil {
 8                 let node = Node(num + 1)
 9                 dict[num] = node
10             } else {
11                 // Duplicate
12                 var nextVal = num
13                 let newNode = Node(nextVal + 1)
14                 while dict[nextVal] != nil {
15                     if let node = dict[nextVal] {
16                         dict[nextVal] = newNode
17                         nextVal = node.val
18                     }
19                 }
20                 dict[nextVal] = newNode
21                 newNode.val = nextVal + 1
22                 count += (nextVal - num)
23             }
24         }
25         
26         return count
27     }
28     
29     class Node {
30         var val: Int
31         init(_ a: Int) {
32             self.val = a
33         }
34     }
35 }
原文地址:https://www.cnblogs.com/strengthen/p/10015200.html