反悔贪心,LeetCode 2813. 子序列最大优雅度

2024-06-13 18:20

本文主要是介绍反悔贪心,LeetCode 2813. 子序列最大优雅度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

1、题目描述

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。

items[i] = [profiti, categoryi],其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。

现定义 items 的 子序列 的 优雅度 可以用 total_profit + distinct_categories2 计算,其中 total_profit 是子序列中所有项目的利润总和,distinct_categories 是所选子序列所含的所有类别中不同类别的数量。

你的任务是从 items 所有长度为 k 的子序列中,找出 最大优雅度 。

用整数形式表示并返回 items 中所有长度恰好为 k 的子序列的最大优雅度。

注意:数组的子序列是经由原数组删除一些元素(可能不删除)而产生的新数组,且删除不改变其余元素相对顺序。

2、接口描述

python3
 ​
class Solution:def findMaximumElegance(self, items: List[List[int]], k: int) -> int:
cpp
 ​
class Solution {
public:long long findMaximumElegance(vector<vector<int>>& items, int k) {}
};
js
 ​
/*** @param {number[][]} items* @param {number} k* @return {number}*/
var findMaximumElegance = function(items, k) {};

3、原题链接

2813. 子序列最大优雅度


二、解题报告

1、思路分析

比较经典的堆式反悔贪心

如何考虑?

我们的收益来自于序列中的profit和以及不同的种类数

这样如何决策?

我们初始先将物品按照profit降序排序

然后取前k个,后面进行反悔贪心

后面物品的profit不会比前面大,如果想要让整体变大,除非种类变多

所以,我们记录前k个元素构成序列中的重复元素,然后如果后面的元素种类是新的,我们就拿掉最小的一个重复元素和其替换

过程中维护最大值即可

2、复杂度

时间复杂度: O(NlogN)空间复杂度:O(N)

3、代码详解

python3
 ​
class Solution:def findMaximumElegance(self, items: List[List[int]], k: int) -> int:items.sort(key=lambda x: -x[0])res = s = 0st = set()cur = []for i, (p, c) in enumerate(items):if i < k:s += pif c in st:cur.append(p)else:st.add(c)elif c not in st and cur:s += p - cur.pop()st.add(c)res = max(res, s + len(st) * len(st))if len(st) == k:breakreturn res
cpp
 ​
using i64 = long long;
class Solution {
public:long long findMaximumElegance(vector<vector<int>>& items, int k) {i64 res = 0, s = 0;std::sort(items.begin(), items.end(), [](auto& x, auto& y) {return x[0] > y[0];});std::vector<int> cur;std::unordered_set<int> st;for (int i = 0; i < items.size(); i ++ ) {if (i < k) {s += items[i][0];if (!st.insert(items[i][1]).second)cur.push_back(items[i][0]);}else {if (st.insert(items[i][1]).second && cur.size())s += items[i][0] - cur.back();}res = std::max(res, s + (i64)st.size() * (i64)st.size());}return res;}
};
js
 ​
/*** @param {number[][]} items* @param {number} k* @return {number}*/
var findMaximumElegance = function(items, k) {items.sort((x, y) => y[0] - x[0]);let res = 0, s = 0;let cur = [];let st = new Set();for (let i = 0; i < items.length && st.size < k; i ++ ) {if (i < k) {s += items[i][0];if (st.has(items[i][1])) cur.push(items[i][0]);else st.add(items[i][1]);}else if (cur.length && !st.has(items[i][1])) {s += items[i][0] - cur.pop();st.add(items[i][1]);}res = Math.max(res, s + st.size * st.size);}return res;
};

这篇关于反悔贪心,LeetCode 2813. 子序列最大优雅度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058067

相关文章

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl