1.题目
2. 方法
贪心法即可。主要思想如下:
- step1. 将values数组和labels数组按照顺序排序,排序规则是按照values中的大小。并将排好序的信息放到一个list中,该list中的每项都是一个tuple
- step2.按照
numWanted和useLimit计算可以得到的最大和。
3. 代码
具体代码如下,需要注意的是:对list排序的实现使用的key与reverse。
class Solution:
def largestValsFromLabels(self, values: List[int], labels: List[int], numWanted: int, useLimit: int) -> int:
# step1.得到一个数组
arr =[(val,lab) for val,lab in zip(values,labels)]
# step2. 然后将数组排序,按照值的大小
# 注意语法
arr = sorted(arr,key = lambda x:x[0], reverse=True)
# step 3. 对dict进行初始化
# 这里可以直接使用defaultdict(int) 代替显式初始化
lab2dic = {}
for lab in labels:
lab2dic[lab] = 0
# step4. 开始计数求和
total = 0
cnt = 0
for i,j in arr:
if cnt < numWanted: # 如果尚未放满
if lab2dic[j] < useLimit:
lab2dic[j] += 1 # 对值为j的数进行计数,不能超过useLimit
total += i
cnt += 1 # 放数+1
else:
break
return total

该文章介绍了一个使用贪心策略来解决问题的算法,首先对values和labels数组按值排序,然后通过限制每个标签下的元素数量(不超过useLimit),计算可以得到的最大和。在Python中,这个过程涉及列表排序、字典计数以及循环遍历来满足numWanted个元素的要求。
223

被折叠的 条评论
为什么被折叠?



