首页 > 其他分享 >(nice!!!)LeetCode 2813. 子序列最大优雅度(反悔贪心)

(nice!!!)LeetCode 2813. 子序列最大优雅度(反悔贪心)

时间:2024-06-13 12:30:37浏览次数:20  
标签:2813 profit sum long st 类别 nice LeetCode cls

2813. 子序列最大优雅度

在这里插入图片描述
在这里插入图片描述

思路:1.先对数组items按profit进行降序排序。
2.把前k个最大的profit选中
3.再遍历剩余的项目,看看能不能增加类别的数量。因为profit是递减的,所以只有类别的数量能增大的情况下,才考虑从选中的k个项目当中删掉重复的类别项目里面的最小profit。
细节看注释,时间复杂度0(nlogn)

class Solution {
public:
    long long findMaximumElegance(vector<vector<int>>& items, int k) {
    	//对数组items按profit进行降序排序
        vector<pair<int ,int>> v;
        for(int i=0;i<items.size();i++){
            v.push_back({items[i][0],items[i][1]});
        }
        sort(v.begin(),v.end(),greater<pair<int ,int>>());
        //sum记录选中的k个项目里的profit之和
        long long sum=0;
        //记录最大优雅度
        long long mx=0;
        //cls记录选中的k个项目里的类别
        unordered_set<int> cls;
        //st记录选中的k个项目里:重复类别的profit,方便后续进行反悔贪心
        stack<int> st;
        for(int i=0;i<v.size();i++){
        	//当选中的项目数量不超过k时
            if(i<k){
            	//sum记录选中项目里的profit之和
                sum+=v[i].first;
                //如果这个类别已经被选过,那么就需要放到栈st里,方便后续的反悔贪心
                if(cls.count(v[i].second)){
                    st.push(v[i].first);
                }else{
                    cls.insert(v[i].second);
                }
            }else{
            	//当前项目的类别没有被选过,且栈st里的元素不空(就是选中的k个项目当中有重复类别,这里就可以进行反悔贪心)
                if(cls.count(v[i].second)==0&&st.size()){
                    sum-=st.top();
                    sum+=v[i].first;
                    st.pop();
                    cls.insert(v[i].second);
                }
            }
            long long tmp=sum+(long long)cls.size()*cls.size();
            mx=max(mx,tmp);
        }

        return mx;
    }
};

标签:2813,profit,sum,long,st,类别,nice,LeetCode,cls
From: https://blog.csdn.net/weixin_46028214/article/details/139650568

相关文章

  • LeetCode132双周赛T3,搜索和DP
    求出最长好子序列Idfs(i,j)表示以nums[i]结尾的,至多有j对相邻元素不同的最长序列的长度转移:枚举p<i,如果nums[p]!=nums[i],就从dfs(p,j-1)+1转移过来如果nums[p]==nums[i],就从dfs(p;j)+1转移过来classSolution{public:intmaximumLength(vector<int......
  • 代码随想录 算法训练营d7 哈希表 Leetcode454 四数相加2 Leetcode383 赎金信 Leetcode
    Leetcode454四数相加2 题目链接简单理解四个数组的数构成元组 相加为0思想:参考力扣第一题两数之和 才用哈希表解决问题通过将ab数组之和存储到哈希表中,并记录次数再通过计算-(c+d)去匹配哈希表如果存在那么count+=次数即可classSolution{publicintfour......
  • (nice!!!)LeetCode 2865. 美丽塔 I(数组、单调栈)
    2865.美丽塔I思路:方法一,时间复杂度0(n^2)。枚举每一个点i作为当前山脉数组的最高点。然后我们通过预处理遍历其前面和后面,来更新两个数组f1、f2。数组f1[i]:表示在满足非递减的情况下,区间0~i,以点i的高度heighs[i]为最高点所能形成的最大高度和。数组f2[i]:表示在满足非......
  • LeetCode 300. 最长递增子序列
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode300.最长递增子序列,难度中等。动态规划解题思路:遍历数组,对于每个nums[i],检查其之前的所有元素nums[j]0......
  • LeetCode刷题之HOT100之单词搜索
    2024/6/12这两天天气只能用闷、潮、热来描述。整个人像被罩在为了饭菜保温的盖子里,喘气困难、粘稠的空气一次又一次打湿我。唯有空调救我,夏天来了。Anyway,昨天只做了一题,今天早点来做一题。1、题目描述2、逻辑分析给定一个二维字符矩阵和一个单词,求单词是否在这个二维......
  • 代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数
    哈希表很重要哈希表哈希表场景一般哈希表都是用来快速判断一个元素是否出现集合里一般来说数组模拟哈希set 哈希map不同的场景 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,se......
  • leetcode刷题-归纳总结
    框架思维124.求⼆叉树中最⼤路径和后序遍历最大路径转换为为求单边最大路径105.根据前序和中序遍历构造二叉树前序遍历,找到根节点构建root,得到左右子树区间,左右子树递归构建注意:1.终止条件2.构建unordered_map230.寻找⼆叉搜索树中的第k⼩的元素⼆叉搜索树即左支树所有......
  • LeetCode 419. 甲板上的战舰(深度优先搜索dfs、数组)
    419.甲板上的战舰思路:方法一,深度优先搜索dfs,遇到‘X’,就dfs一次,并在board中将其变为‘.’。classSolution{public:voiddfs(intx,inty,vector<vector<char>>&board){if(board[x][y]!='X')return;board[x][y]='.';if(x+1......
  • Leetcode419 甲板上的战舰
    最近以来,我在力扣上坚持完成每天一题,今天系统推的题目为《甲板上的战舰》,在此记录一下。题目描述如下:给你一个大小为mxn的矩阵board表示甲板,其中,每个单元格可以是一艘战舰'X'或者是一个空位'.',返回在甲板board上放置的战舰的数量。战舰只能水平或者垂直放置在......
  • LeetCode 409 Longest Palindrome All In One
    LeetCode409LongestPalindromeAllInOneLeetCode409最长回文算法题解Solutions//MapfunctionlongestPalindrome(s:string):number{constmap=newMap();letlen=0;for(leti=0;i<s.length;i++){if(map.has(s[i])){//配对,消元......