1. 解题思路
这一题有点惭愧,我走了弯路,结果居然还是看了大佬们的答案才搞定的,简直惭愧……
这道题其实思路挺简单,首先根据分组规则,我们对原始数组当中得值根据元素进行组合,看一下有多少unique元素以及每个元素对应出现过多少次。然后我们就是要找一个 k k k使得这些次数均可以拆分为 k k k和 k + 1 k+1 k+1的组合,然后求其最少可以分的组数即可。我们甚至还可以进一步简化问题,将同样的次数在进行合并,因为他们的分法一定是相同的。
因此,所有的难点也就在于,如何找到这个最大的 k k k,使得所有的组均可以拆分为 k k k和 k + 1 k+1 k+1的组合。
我一开始想岔了,用二分法想要进一步优化效率,但是后来才发现这个东西他并不是连续变化的,然后就把我自己卡死了……
结果让人吐血的是,其他大佬的解答居然就是一个简单遍历,然后,然后就没有然后了……
属实是画蛇添足了……
2. 代码实现
给出python代码实现如下:
class Solution:
def minGroupsForValidAssignment(self, nums: List[int]) -> int:
tmp = list(Counter(nums).values())
tmp = Counter(tmp)
cnts = list(tmp.keys())
groups = [tmp[x] for x in cnts]
def divide(k):
ans = 0
for cnt, num in zip(cnts, groups):
x = math.ceil(cnt / (k+1))
r = x * (k+1) - cnt
if r > x:
return -1
ans += x*num
return ans
k = min(cnts)
for i in range(k, 0, -1):
ans = divide(i)
if ans != -1:
return ans
return -1
提交代码评测得到:耗时868ms,占用内存34.7MB。