上海小企业网站建设,我想找个人做网站,如何查看网站的外链,工程项目Leetcode 2910. Minimum Number of Groups to Create a Valid Assignment 1. 解题思路2. 代码实现 题目链接#xff1a;2910. Minimum Number of Groups to Create a Valid Assignment
1. 解题思路
这一题有点惭愧#xff0c;我走了弯路#xff0c;结果居然还是看了大佬们…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 k1 k1的组合然后求其最少可以分的组数即可。我们甚至还可以进一步简化问题将同样的次数在进行合并因为他们的分法一定是相同的。
因此所有的难点也就在于如何找到这个最大的 k k k使得所有的组均可以拆分为 k k k和 k 1 k1 k1的组合。
我一开始想岔了用二分法想要进一步优化效率但是后来才发现这个东西他并不是连续变化的然后就把我自己卡死了……
结果让人吐血的是其他大佬的解答居然就是一个简单遍历然后然后就没有然后了……
属实是画蛇添足了……
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 / (k1))r x * (k1) - 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。