1090. 受标签影响的最大值

在这里插入图片描述
题目链接

思路:

两个数组,要形成映射,也就是要组合起来才能排序,求子集和最大
注意:有两个限制条件,子集内元素个数<=numWanted , 重复元素个数useLimit
形成组合用vector存pair<int,int>,用lamada表达式写仿函数提供比较
有两个比较首先是让labels标签升序,选不超uselimit重复的所有标签,并且当标签相同时,让value更大的靠前,也就是第二比较册略是升序value

还没有完,这样得到的集合,还要进行去重,重复限制是uselimit
去重后,还要对unique_vec进行value排序,因为之前的排序是为了去重,同时尽可能保留每一组标签的值最大

此时unique_vec的性质是,每个标签不会多于uselimit,并且保留的标签都是那一组标签的值最大的

因为还有子集数量的限制,所以再进行对值的sort,让value更大的靠前

/*

*/
class Solution {
    public:
    int largestValsFromLabels(vector<int> & values, vector<int> & labels,
                              int numWanted, int useLimit) {
        int n = values.size();
        vector<pair<int, int>> vec(n);
        for (int i = 0; i < n; i++) {
            vec[i].first = values[i];
            vec[i].second = labels[i];
        }
        //这个sort,按标签升序,并且标签组内按其value降序
        sort(vec.begin(), vec.end(), [](pair<int, int> & p1, pair<int, int> & p2) {
            if (p1.second != p2.second)
                return p1.second < p2.second;//为去重做准备
            else
                return p1.first > p2.first;//保证去重后较大的值的标签靠前,别把大值的标签去重删了
        });

        for (auto x : vec) {
            cout << x.first << " " << x.second << endl;
        }

        int last = vec[0].second;
        int count = 1;
        vector<pair<int, int>> unique_vec;
        unique_vec.push_back(vec[0]);
        for (int i = 1; i < n; i++) {
            if (vec[i].second == last) {
                if (count == useLimit)
                    continue;
                count++;
                unique_vec.push_back(vec[i]);
            } else {
                count = 1;
                unique_vec.push_back(vec[i]);
                last = vec[i].second;
            }
        }
        int sum = 0;
        sort(unique_vec.begin(), unique_vec.end(), [](pair<int, int> & p1,
        pair<int, int> & p2) {
            return p1.first > p2.first;
        });
        for (int i = 0; i < numWanted && i < unique_vec.size(); i++)
            sum += unique_vec[i].first;
        return sum;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值