- Leetcode 2910. Minimum Number of Groups to Create a Valid Assignment
- 1. 解题思路
- 2. 代码实现
- 题目链接:2910. Minimum Number of Groups to Create a Valid Assignment
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 = 0for cnt, num in zip(cnts, groups):x = math.ceil(cnt / (k+1))r = x * (k+1) - cntif r > x:return -1ans += x*numreturn ansk = min(cnts)for i in range(k, 0, -1):ans = divide(i)if ans != -1:return ansreturn -1
提交代码评测得到:耗时868ms,占用内存34.7MB。