力扣每日一题 6/13 反悔贪心算法

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

2813.子序列最大优雅度【困难

题目:

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

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

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

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

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

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

示例 1:

输入:items = [[3,2],[5,1],[10,1]], k = 2
输出:17
解释:
在这个例子中,我们需要选出长度为 2 的子序列。
其中一种方案是 items[0] = [3,2] 和 items[2] = [10,1] 。
子序列的总利润为 3 + 10 = 13 ,子序列包含 2 种不同类别 [2,1] 。
因此,优雅度为 13 + 22 = 17 ,可以证明 17 是可以获得的最大优雅度。 

示例 2:

输入:items = [[3,1],[3,1],[2,2],[5,3]], k = 3
输出:19
解释:
在这个例子中,我们需要选出长度为 3 的子序列。 
其中一种方案是 items[0] = [3,1] ,items[2] = [2,2] 和 items[3] = [5,3] 。
子序列的总利润为 3 + 2 + 5 = 10 ,子序列包含 3 种不同类别 [1, 2, 3] 。 
因此,优雅度为 10 + 32 = 19 ,可以证明 19 是可以获得的最大优雅度。

示例 3:

输入:items = [[1,1],[2,1],[3,1]], k = 3
输出:7
解释:
在这个例子中,我们需要选出长度为 3 的子序列。
我们需要选中所有项目。
子序列的总利润为 1 + 2 + 3 = 6,子序列包含 1 种不同类别 [1] 。
因此,最大优雅度为 6 + 12 = 7 。

提示:

  • 1 <= items.length == n <= 10**5
  • items[i].length == 2
  • items[i][0] == profiti
  • items[i][1] == categoryi
  • 1 <= profiti <= 10**9
  • 1 <= categoryi <= n
  • 1 <= k <= n

分析问题:

        解这道题主要还是要有一定的思维能力,对贪心算法有一定的知识储备。因为这道题考察的内容确实有点多,在它的标签里列出了 贪心,栈,数组,哈希表,排序,堆(优先队列);可见这题考的内容之丰富,不过不用慌,在Python中列表可以充当大部分的数据结构,把列表运用好可以解决大多数问题。

那么这道题的话思路如下:

先把items按照利润大小排序(假设从大到小排序),然后先取前k个,计算出当前的value值;

然后考虑k+1以及之后的元素,首先要明白k+1后面的元素的利润值都是低于之前的任何一个的,那么分类讨论:

  • 如果k+1的种类存在于前k个元素中,那么把k+1加进去没有任何意义,种类重复利润还少,直接跳过即可。
  • 如果k+1的种类不存在于前k个元素中,那么我们要选一个种类重复的且利润最小的元素出来和他交换,这时候利润虽然减小了但是种类+1了,记录此时的a_value值,于原value值相比,谁大取谁作为value。

        按照这个思路,往下遍历,计算优雅度,取最大值即可。 不过要注意的是这里要记录种类重复的元素,以及将他们按照利润大小排序。这里可以直接用一个列表和一个集合实现,因为遍历的顺序是按照利润从大到小,所以加入到ls里面的元素的顺序一定是按照利润值从大到小的,直接将其翻转,先拿小的交换,这里需要一个指针,交换一次指针向前走一步,标记要被交换的元素。接下来看具体的代码实现:


代码实现:

class Solution:
    def findMaximumElegance(self, items: List[List[int]], k: int) -> int:
        items.sort(key= lambda items:items[0],reverse=True)
        ls=items[:k] # 先按利益大小取前k个最大的元素
        seen,ll,su=set(),[],0 # seen用来标记出现过的种类
        for i,j in ls:
            if j not in seen: seen.add(j)
            else: ll.append([i,j])
            su+=i
        value=su+len(seen)**2  # 计算当前最大优雅度
        if len(ll)==0: return value
        ll,re=ll[::-1],0  # re 指针 用来标记要和ll中的哪个元素比较
        for q in items[k:]:
            if q[1] not in seen and re<=len(ll)-1:
                key=q[0]-ll[re][0]
                seen.add(q[1])
                su+=key
                re+=1
                a_va=su+(len(seen))**2
                if a_va>value:
                    value=a_va
        return value


总结:

代码逐行解释:

  1. 函数定义

    • 定义了名为 findMaximumElegance 的函数,接受 items 列表和整数 k 作为参数。
  2. 初始化操作

    • 对 items 按照第一项(利益大小)进行降序排序。
    • 取出前 k 个元素存储在 ls 列表中。
    • 创建空集合 seen 用于标记出现过的种类。
    • 创建空列表 ll 用于存储重复种类的元素。
    • 初始化变量 su 为 0,用于累计利益总和。
  3. 计算初始优雅度

    • 遍历 ls 中的每个元素 [i, j] ,如果 j 不在 seen 中,将其添加到 seen 中;否则,将该元素添加到 ll 中。
    • 累加 ls 中元素的利益到 su 。
    • 计算初始优雅度 value 为 su + len(seen) ** 2 。
  4. 处理剩余元素以优化优雅度

    • 如果 ll 不为空,将其反转。
    • 遍历 items 中 k 之后的元素 q 。
    • 如果 q 的种类不在 seen 中且 re 指针未超出 ll 的范围,计算用 q 替换 ll[re] 带来的利益变化 key 。
    • 更新 seen 、 su ,计算新的优雅度 a_va 。
    • 如果 a_va 大于当前的 value ,更新 value 。
  5. 返回结果

    • 函数最终返回计算得到的最大优雅度 value 。

 考查内容:

  1. 排序算法的应用:通过对 items 列表按照特定规则(第一项的利益大小)进行排序,为后续的选择操作奠定基础。
  2. 数据结构的运用:使用集合 seen 来快速判断元素的种类是否已经出现,利用列表 ll 存储重复种类的元素。
  3. 贪心算法的思想:先选择前 k 个利益最大的元素,然后通过逐步替换来尝试优化结果,体现了贪心选择局部最优以期望达到全局最优的思路。
  4. 逻辑推理和计算能力:在计算优雅度、判断是否替换元素以及更新相关变量时,需要准确的逻辑推理和计算。

学到的内容:

  1. 熟练掌握排序函数的使用,能够根据具体需求对数据进行排序。
  2. 学会运用合适的数据结构来提高算法的效率和便捷性,例如集合的快速查找和去重特性。
  3. 深入理解贪心算法的策略,以及如何在特定问题中应用贪心思想来解决优化问题。
  4. 提升了对复杂逻辑的分析和处理能力,包括条件判断、变量更新和结果优化。
  5. 培养了通过逐步推导和计算来求解最优解的思维方式,同时也学会了如何在算法中有效地管理和利用数据。

To sum up: 这道题的算法有另一个好听的名字叫 反悔贪心,难度还是在线的,多思考,多理解。 

“江流天地外,山色有无中。”——王维 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705543.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue技巧(十)全局配置使用(打包后可修改配置文件)

1、背景 vue打包目前主流用的有webpack和vite两种&#xff0c;默认用的webpack。&#xff08;二者的区别大家可以各自上网查&#xff0c;我没用过vite&#xff0c;所以不过多介绍&#xff09;vue通过webpack打包后&#xff0c;源码会被压缩&#xff0c;但一些关键配置可…

Redis高级特性和应用:慢查询、Pipeline、事务、Lua

Redis提供了许多高级特性&#xff0c;可以帮助优化和管理系统性能。本文将介绍Redis的慢查询、Pipeline、事务和Lua脚本的使用及其相关配置。 Redis的慢查询 慢查询日志是开发和运维人员定位系统慢操作的重要工具。Redis也提供了类似的功能&#xff0c;通过记录超过预设阀值的…

C# WPF入门学习主线篇(三十四)—— 图形和动画

C# WPF入门学习主线篇&#xff08;三十四&#xff09;—— 图形和动画 图形和动画是WPF的重要组成部分&#xff0c;能够大幅提升应用程序的用户体验。本篇博客将详细介绍WPF中图形和动画的使用方法&#xff0c;涵盖基本图形绘制、动画创建及多媒体的应用。通过本文&#xff0c;…

2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;激活码&#xff0c;点击获取 ② 这个时候就跳转到现成账号页面&#xff0c;点击获取体验号&#xff0c;如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

二十三、生成帮助文档

二十一、Java工具类的创建 二十二、Jar包制作及使用 这一篇开始学习如何生成帮助文档。为什么要学习生成帮助文档&#xff1f; 1、工具类已经制作好了&#xff0c;Java工具类的创建的类是一个.java文件&#xff0c;编译后成.class文件看不懂&#xff0c;所以需要对应的帮助文档…

我的高考往事

高考对于每一个参加过的人来说&#xff0c;都是一段非常难忘的回忆。 我参加高考&#xff0c;是在2001年。虽然迄今已经过去了23年&#xff0c;但很多细节仍然记忆犹新。 今天这篇文章&#xff0c;我就和大家分享一下&#xff0c;我的高考往事。 █ 青少年时代 我的老家是在江西…

函数式开发接口( Consumer、Function)在实际开发中的应用场景

之前有个扫码下载文件需求&#xff0c;由于要同时进行记录下载人的记录。一开始用的是异步进行日志记录。发现有的用户扫码下载了一次文件&#xff0c;日志记录了三条。这种很容易联想到是因为网络抖动造成的。 问题代码 由于日志记录是异步的&#xff0c;文件下载需要时间。同…

TikTok网红营销指南 | 怎么找到TikTok网红并进行合作?

如果你打算在tiktok上进行营销&#xff0c;忽略与tiktok网红合作无异于错失良机&#xff0c;时尚博主Sophia仅用一条30秒的视频展示了自己从一家新兴品牌购买的连衣裙&#xff0c;视频迅速获得了数百万的点赞和评论&#xff0c;也让该品牌的销量翻了好几倍。 这种与网红合作的策…

Mac 下载并激活IDEA

1.https://3.jetbra.in 打开这个网站,点击第一个网速比较快的连接 2.在新页面顶部有一个蓝色的下载链接文字< jetbra.zip(20220801) >点击下载 3.步骤2打开的页面不要关闭后面还有用 4.在idea官网下载idea对应的版本 https://www.jetbrains.com/idea/download/other.htm…

ADALORA: ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING

文章汇总 LoRA&#xff1a; W W ( 0 ) Δ W ( 0 ) B A WW^{(0)}\Delta W^{(0)}BA WW(0)ΔW(0)BA AdaLoRA&#xff1a;$WW^{(0)}\Delta W^{(0)}P\Lambda Q$ AdaLoRA的做法是让模型学习SVD分解的近似。在损失函数中增加了惩罚项(4)&#xff0c;防止矩阵 P P P和 Q Q Q偏离正…

Leetcode 力扣117. 填充每个节点的下一个右侧节点指针 II (抖音号:708231408)

给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#xff0c;所有 next 指针都…

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果&#xff1a; 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 &#xff08;1&#xff09;声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

干货下载 |《数据治理:数据中台建设与能力提升策略》

在当今这个信息爆炸的时代&#xff0c;数据已经成为企业最宝贵的资产之一。数据不仅能帮助企业洞察市场趋势&#xff0c;还能优化业务流程&#xff0c;提升运营效率&#xff0c;进而在激烈的市场竞争中占据优势地位。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;…

Centos: ifconfig command not found且ip addr查不到服务器IP

前段时间部门新派发了服务器&#xff0c;让我过去使用U盘装机&#xff0c;装完后使用ifconfig查不到服务器IP地址&#xff0c;ip addr也是查不到 ifconfig&#xff1a;command not found (这两个图片先用虚拟机的替代一下) 在网上找资料(CSDN&#xff0c;博客园&#xff0c;知乎…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一&#xff0c;FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期&#xff0c;FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink &#xff08;确实开源&#xff09;&#xff0c;为国产开源技术生态注入新活力。…

平安科技智能运维案例

平安科技智能运维案例 在信息技术迅速发展的背景下&#xff0c;平安科技面临着运维规模庞大、内容复杂和交付要求高等挑战。通过探索智能运维&#xff0c;平安科技建立了集中配置管理、完善的运营管理体系和全生命周期运维平台&#xff0c;实施了全链路监控&#xff0c;显著提…

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…

Qt篇——-1: error: fatal error: no input files问题解决

有时在pro或pri中引用的文件被删除或重命名后&#xff0c;会导致pro或pri文件中自动出现两个连续的//&#xff0c;这将导致我们编译时提示&#xff1a;-1: error: fatal error: no input files。 这是因为qmake 语法里每增加一个源文件或一个配置用一个斜杠结束&#x…

SJ901-II安全网耐冲击贯穿测试仪

一、主要用途 依据GB5725-2009最新国家标准研发&#xff0c;主要用于检测安全网的耐冲击性能和贯穿性能。 二、仪器特征 1、测试架采用多模块设计理念&#xff0c;可以实现安全网和安全带的试验。后期如果您们上安全带整体动态和整体静态试验&#xff0c;把所需部件直接安装到…

多商户小程序开发步骤和方法

在当今的数字经济中&#xff0c;多商户小程序作为一种创新的商业平台&#xff0c;提供了一种新的商业模式&#xff0c;使多个商户能够在同一平台上展示和销售他们的产品或服务。这种模式不仅增强了消费者选择的多样性&#xff0c;也为商家提供了一个更广泛的销售渠道。以下是详…