首页 > 其他分享 >LeetCode 2542. 最大子序列的分数(贪心、小顶堆)

LeetCode 2542. 最大子序列的分数(贪心、小顶堆)

时间:2024-06-22 14:01:14浏览次数:7  
标签:2542 qu sum long nums1 ans 小顶 LeetCode nums2

2542. 最大子序列的分数

在这里插入图片描述

在这里插入图片描述
思路:先对nums2按降序排列,然后遍历nums2的最小值,同时在区间[0,i]中选中k个最大的nums1即可。然后找出最大的ans

class Solution {
public:
    typedef pair<int,int> PII;
    long long maxScore(vector<int>& nums1, vector<int>& nums2, int k) {
    	//将nums1和nums2结合起来,按nums2的降序排列
        vector<PII> v;
        for(int i=0;i<nums1.size();i++){
            v.push_back({nums2[i],nums1[i]});
        }
        sort(v.rbegin(),v.rend());
        //记录在[0,i]区间最大的k个nums1的和
        long long sum=0;
        //小顶堆记录选中的k个nums1
        priority_queue<int,vector<int>,greater<int>> qu;
        //记录最大值
        long long ans=0;
        for(int i=0;i<v.size();i++){
        	//数量不够k个,就得都选
            if(i<k){
                qu.push(v[i].second);
                sum+=v[i].second;
            }else{
            	//因为nums2是降序的,所以我们只需要维护最大的k个nums1的和
                if(qu.top()<v[i].second){
                    sum=sum-qu.top()+v[i].second;
                    qu.pop();
                    qu.push(v[i].second);
                }
                
            }
            //当选中的数超过k个值时,就开始更新ans
            if(i>=k-1){
                ans=max(ans,sum*v[i].first);
            }
        }
        return ans;
    }
};

标签:2542,qu,sum,long,nums1,ans,小顶,LeetCode,nums2
From: https://blog.csdn.net/weixin_46028214/article/details/139881712

相关文章

  • LeetCode刷题day3——链表part1
    203.移除链表元素这个题是二刷了一开始这个思路就是利用虚拟头结点,但是中间很多小细节都考虑不到,例如初始化一个新的链表,循环条件的写法等classSolution{public:structListNode{intval;ListNode*next;ListNode(intx):val(x),next(NULL){};//定义构......
  • LeetCode刷题day4——链表part2
    24.两两交换链表中的节点用pre代表第1个节点,cur代表它后面的相邻节点,tmp存储cur->next。但是问题找不到怎么返回新的节点。想着就循环一次,在第一次交换的时候就确认新的头结点。但还存在很多问题,具体如下:classSolution{public:ListNode*swapPairs(ListNode*he......
  • (nice!!!)LeetCode LCP 20. 快速公交(记忆化搜索+小顶堆+贪心)
    LCP20.快速公交思路:逆向记忆化搜索。思考从target到0所花的最小时间。通过哈希表来进行记忆化搜索,避免重复遍历。细节看注释classSolution{public:typedeflonglongLL;typedefpair<LL,LL>PII;constintmod=1e9+7;intbusRapidTransit(int......
  • LeetCode热题100-第2题
    题目:49.字母异位词分组-力扣(LeetCode)给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["......
  • 【LeetCode】215.数组中的第K个最大元素
    题目描述给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2输出:5示例2:输入:[3,2......
  • LeetCode 热题100 --哈希
    哈希哈希,有限空间映射一个无限的空间。在空间内,有序化进行快速查询。用空间换时间。1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数......
  • leetcode 动态规划 (基础版)打家劫舍
    题意:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ......
  • leetcode 动态规划(基础版)删除并获得点数
    题目:给你一个整数数组  ,你可以对它进行一些操作。nums每次操作中,选择任意一个  ,删除它并获得  的点数。之后,你必须删除 所有 等于  和  的元素。nums[i]nums[i]nums[i]-1nums[i]+1开始你拥有 个点数。返回你能通过这些操作获得的最大点数。0题解:要会理解......
  • leetcode225用队列实现栈
    本文主要讲解用队列实现栈的要点与细节,按照步骤思考更方便理解,同类型用栈实现队列c++与java代码如下,末尾请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:voidpush(intx) 将元素x压入栈顶。intp......
  • Leetcode Hot100之双指针
    1.移动零题目描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。解题思路双指针遍历一遍即可解决:我们定义了两个指针i和j,它们都初始化为0。然后,我们开始遍历列表......