Python中标签中的最大值

假设我们有一组项目:第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