码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode1090. 受标签影响的最大值

时间:2019-06-16 22:03:19      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:示例   要求   back   tco   iter   label   bsp   结果   分析   

问题:

我们有一个项的集合,其中第 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. 受标签影响的最大值

标签:示例   要求   back   tco   iter   label   bsp   结果   分析   

原文地址:https://www.cnblogs.com/youdias/p/11032984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!