LeetCode1090. 受标签影响的最大值

Posted youdias

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode1090. 受标签影响的最大值相关的知识,希望对你有一定的参考价值。

问题:

我们有一个项的集合,其中第 i 项的值为 values[i],标签为 labels[i]

我们从这些项中选出一个子集 S,这样一来:

  • |S| <= num_wanted
  • 对于任意的标签 L,子集 S 中标签为 L 的项的数目总满足 <= use_limit

返回子集 S 的最大可能的 和。

 

示例 1:

输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1
输出:9
解释:选出的子集是第一项,第三项和第五项。

示例 2:

输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], num_wanted = 3, use_limit = 2
输出:12
解释:选出的子集是第一项,第二项和第三项。

示例 3:

输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 1
输出:16
解释:选出的子集是第一项和第四项。

示例 4:

输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 2
输出:24
解释:选出的子集是第一项,第二项和第四项。

 

提示:

  1. 1 <= values.length == labels.length <= 20000
  2. 0 <= values[i], labels[i] <= 20000
  3. 1 <= num_wanted, use_limit <= values.length

 


 

链接:https://leetcode-cn.com/contest/weekly-contest-141/problems/largest-values-from-labels/

分析:

给出一个项的集合,选出子集,要求和的最大值,其中选出至多num_wanted个数字,并且同一标签的个数不超过use_limit。

可以将原始输出的数据按照label作为可以,重构为map数据,value按照值排序。

那么可以从每个lable中选出不超过use_limit个数据,构架一个vector,最终结果出自这个vector,将vector排序,选出最大的num_wanted个求和即可。

 

AC Code:

 

 1 class Solution 
 2 public:
 3 int largestValsFromLabels(vector<int>& values, vector<int>& labels, int num_wanted, int use_limit) 
 4         int ret = 0;
 5         map<int, vector<int> > alldata;
 6         vector<int> opdata; 8         for (int i = 0; i < values.size(); i++)
 9         
10             alldata[labels[i]].emplace_back(values[i]);
11         
12         for (map<int,vector<int> >::iterator it = alldata.begin(); it != alldata.end(); it++)
13         
14             sort((*it).second.begin(), (*it).second.end());
15             reverse((*it).second.begin(), (*it).second.end());
16             int num = 0;
17             for (int i = 0; i < (*it).second.size() && i < use_limit; i++)
18             
19                 opdata.emplace_back((*it).second[i]);
20             
21         
22         sort(opdata.begin(), opdata.end());
23         reverse(opdata.begin(), opdata.end());
24         for (int i = 0; i < num_wanted && i<opdata.size(); i++)
25         
26             ret += opdata[i];
27         
28         return ret;
29     
30 ;

 

其他:

1,第一code:

    class Solution 
        public int largestValsFromLabels(int[] values, int[] labels, int num_wanted, int use_limit) 
            int n = values.length;
            int[][] ai = new int[n][];
            for(int i = 0;i < n;i++)
                ai[i] = new int[]values[i], labels[i];
            
            Arrays.sort(ai, new Comparator<int[]>() 
                public int compare(int[] a, int[] b) 
                    return a[0] - b[0];
                
            );
            int[] f = new int[50000];
            int sum = 0;
            int used = 0;
            for(int i = n-1;i >= 0;i--)
                if(used < num_wanted && ++f[ai[i][1]] <= use_limit)
                    sum += ai[i][0];
                    used++;
                
            
            return sum;
        
    

第二C++代码:

class Solution 
public:
    int largestValsFromLabels(vector<int>& values, vector<int>& labels, int num_wanted, int use_limit) 
        vector< pair<int, int> > v;
        for(int i = 0 ; i < values.size() ; i++)
            v.push_back(values[i], labels[i]);
        sort(v.rbegin(), v.rend());
        int lc[30000] = ;
        int ans = 0;
        int cc = 0;
        for(int i = 0 ; i < v.size() ; i++)
            if( cc + 1 > num_wanted ) continue;
            int vv = v[i].first;
            int ll = v[i].second;
            if( lc[ll] + 1 > use_limit )
                continue;
            
            ans += vv;
            lc[ll]++;
            cc++;
        
        
        return ans;
        
    
;

2  vector sort默认升序,如果想要降序需要编写自定义比较函数,可以sort后reverse。

以上是关于LeetCode1090. 受标签影响的最大值的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1090. Largest Values From Labels

leetcode1090. Largest Values From Labels

Android build.gradle 错误:ParseError at [row,col]:[65,9] 消息:预期的开始或结束标签 受影响的模块:app

天大 ACM 1090. City hall

PAT A1090 Highest Price in Supply Chain [树的遍历]

受javascript影响后如何恢复到原来的DOM