反悔贪心,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实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动