-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLC_1681.kt
47 lines (43 loc) · 1.44 KB
/
LC_1681.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import kotlin.math.abs
class Solution {
private var min = Int.MAX_VALUE
private var bucketSize = 0
fun minimumIncompatibility(nums: IntArray, k: Int): Int {
val n = nums.size
bucketSize = n / k
val sets: MutableList<MutableSet<Int>> = ArrayList()
for (i in 0 until k) {
sets.add(HashSet())
}
backtrack(nums, 0, sets, 0)
return if (min == Int.MAX_VALUE) -1 else min
}
private fun backtrack(nums: IntArray, idx: Int, sets: List<MutableSet<Int>>, acc: Int) {
var acc = acc
if (idx >= nums.size) {
min = min.coerceAtMost(acc)
return
}
val visited: MutableSet<Set<Int>> = HashSet()
for (set in sets) {
if (set.contains(nums[idx]) || set.size == bucketSize || visited.contains(set)) continue
val impact = computeImpact(set, nums[idx])
acc += impact
if (acc < min) {
set.add(nums[idx])
backtrack(nums, idx + 1, sets, acc)
set.remove(nums[idx])
}
acc -= impact
visited.add(set)
}
}
private fun computeImpact(set: Set<Int>, num: Int): Int {
if (set.isEmpty()) return 0
if (set.size == 1) return abs(num - set.first())
val lo = set.min()!!
val hi = set.max()!!
if (num < lo) return lo - num
return if (num > hi) num - hi else 0
}
}