假设我们有一组项目:第i个项目具有值value [i]和标签label [i]。然后,我们将取这些项目的子集S,使得-
| S | <= num_wanted
对于每个标签L,带有标签L的S中存在的项目数为<= use_limit。
我们必须找到子集S的最大可能和。
例如,如果输入是类似值= [5,4,3,2,1],标签是[1,1,2,2,3],num_wanted = 3,use_limit = 1,那么输出将是9这是因为在第一,第三和第五项中选择了子集。
为了解决这个问题,我们将遵循以下步骤-
制作一个数组v
对于i,范围为0到值的长度
将[值[i],标签[i]]插入v
对v数组排序
ans:= 0,使用:=空映射,而i:= 0
而num_wanted和i <v的长度
将num_wanted减少1
ans:= ans + v [i,0]
使用量[v [i,1]]增加1
将num_wanted减少1
ans:= ans + v [i,0]
使用[v [i,1]]:= 1
如果使用映射中不存在v [i,1]
else use [v [i,1]] <use_limit
使我增加1
返回ans
让我们看下面的实现以更好地理解-
class Solution(object): def largestValsFromLabels(self, values, labels, num_wanted, use_limit): v = [] for i in range(len(values)): v.append([values[i],labels[i]]) v = sorted(v,key = lambda v:v[0],reverse=True) ans = 0 use = {} i = 0 while num_wanted and i < len(v): if v[i][1] not in use: num_wanted -=1 ans+=v[i][0] use[v[i][1]] = 1 elif use[v[i][1]]<use_limit: num_wanted -=1 ans+=v[i][0] use[v[i][1]]+=1 i+=1 return ans ob = Solution()print(ob.largestValsFromLabels([5,4,3,2,1],[1,1,2,2,3],3,1))
[5,4,3,2,1] [1,1,2,2,3] 3 1
输出结果
9