news 2026/4/23 14:59:55

leetcode 3013. 将数组分成最小总代价的子数组 II 困难

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 3013. 将数组分成最小总代价的子数组 II 困难

给你一个下标从0开始长度为n的整数数组nums和两个整数kdist

一个数组的代价是数组中的第一个元素。比方说,[1,2,3]的代价为1[3,4,1]的代价为3

你需要将nums分割成k连续且互不相交的子数组,满足第二个子数组与第k个子数组中第一个元素的下标距离不超过dist。换句话说,如果你将nums分割成子数组nums[0..(i1 - 1)], nums[i1..(i2 - 1)], ..., nums[ik-1..(n - 1)],那么它需要满足ik-1 - i1 <= dist

请你返回这些子数组的最小总代价。

示例 1:

输入:nums = [1,3,2,6,4,2], k = 3, dist = 3输出:5解释:将数组分割成 3 个子数组的最优方案是:[1,3] ,[2,6,4] 和 [2] 。这是一个合法分割,因为 ik-1 - i1 等于 5 - 2 = 3 ,等于 dist 。总代价为 nums[0] + nums[2] + nums[5] ,也就是 1 + 2 + 2 = 5 。 5 是分割成 3 个子数组的最小总代价。

示例 2:

输入:nums = [10,1,2,2,2,1], k = 4, dist = 3输出:15解释:将数组分割成 4 个子数组的最优方案是:[10] ,[1] ,[2] 和 [2,2,1] 。这是一个合法分割,因为 ik-1 - i1 等于 3 - 1 = 2 ,小于 dist 。总代价为 nums[0] + nums[1] + nums[2] + nums[3] ,也就是 10 + 1 + 2 + 2 = 15 。 分割 [10] ,[1] ,[2,2,2] 和 [1] 不是一个合法分割,因为 ik-1 和 i1 的差为 5 - 1 = 4 ,大于 dist 。 15 是分割成 4 个子数组的最小总代价。

示例 3:

输入:nums = [10,8,18,9], k = 3, dist = 1输出:36解释:将数组分割成 4 个子数组的最优方案是:[10] ,[8] 和 [18,9] 。这是一个合法分割,因为 ik-1 - i1 等于 2 - 1 = 1 ,等于 dist 。总代价为 nums[0] + nums[1] + nums[2] ,也就是 10 + 8 + 18 = 36 。 分割 [10] ,[8,18] 和 [9] 不是一个合法分割,因为 ik-1 和 i1 的差为 3 - 1 = 2 ,大于 dist 。 36 是分割成 3 个子数组的最小总代价。

提示:

  • 3 <= n <= 10^5
  • 1 <= nums[i] <= 10^9
  • 3 <= k <= n
  • k - 2 <= dist <= n - 2

分析:第一个子数组的首位一定是 nums[0],那么之后要从 nums[1] 开始划分 k-1 个子数组,且第二个子数组和最后一个子数组的首位数字下标之差要小于等于 dist,要求的总代价就是 nums[0] 与之后 [1+x,1+dist+x](其中 x 为 0 到 n-1-dist 之间的值) 这个区间内前 k-1 个最小值之和。

可以维护一个大小为 dist+1 的滑动窗口,记录其中的前 k 个数字作为当前区间的划分代价。为了达到这个目的,需要用两个有序集合,一个记录前 k 个较小值,一个记录剩下的 dist+1-k 个数。始终维护这两个有序集合里一个有 k 个较小值,两个集合的值为 1+dist 即可。实现方法可以用mutiset,也可以用一个最大堆加一个最小堆。用堆需要注意删除的时机。

class Solution { public: long long minimumCost(vector<int>& nums, int k, int dist) { long long ans=0x3fffffff,sum=0; int n=nums.size(),cnt_first=0;k--; priority_queue<int,vector<int>,less<int>>first; priority_queue<int,vector<int>,greater<int>>origin,second; for(int i=1,j=0;j<=dist;++j,++i) origin.push(nums[i]); for(int i=0,j=0;i<=dist;++i,++j) { int x=origin.top();origin.pop(); if(j<k)first.push(x),sum+=x; else second.push(x); } ans=sum;cnt_first=first.size(); map<int,int>wait_del; for(int i=2;i<n-dist;++i) { int del=nums[i-1],add=nums[i+dist]; wait_del[del]++; if(del<=first.top())sum-=del,cnt_first--; while(!first.empty()&&wait_del[first.top()]) wait_del[first.top()]--,first.pop(); while(!second.empty()) { if(wait_del[second.top()])wait_del[second.top()]--,second.pop(); else if(cnt_first<k)sum+=second.top(),first.push(second.top()),second.pop(),cnt_first++; else break; } if(add<=first.top()) { first.push(add),sum+=add,cnt_first++; if(cnt_first>k) { while(!first.empty()) { if(wait_del[first.top()])wait_del[first.top()]--,first.pop(); else if(cnt_first>k)sum-=first.top(),second.push(first.top()),first.pop(),cnt_first--; else break; } } else if(cnt_first<k) { while(!second.empty()) { if(wait_del[second.top()])wait_del[second.top()]--,second.pop(); else if(cnt_first<k)sum+=second.top(),first.push(second.top()),second.pop(),cnt_first++; else break; } } } else { second.push(add); if(cnt_first>k) { while(!first.empty()) { if(wait_del[first.top()])wait_del[first.top()]--,first.pop(); else if(cnt_first>k)sum-=first.top(),second.push(first.top()),first.pop(),cnt_first--; else break; } } else if(cnt_first<k) { while(!second.empty()) { if(wait_del[second.top()])second.pop(),wait_del[second.top()]--; else if(cnt_first<k)sum+=second.top(),first.push(second.top()),second.pop(),cnt_first++; else break; } } } ans=min(ans,sum); } return ans+nums[0]; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:11:47

拒绝掉帧!华硕显卡启用G-SYNC解锁丝滑游戏战场

传统显示器60Hz的刷新率限制了显卡性能的发挥&#xff0c;即使换一个高刷新率显示器也只能在一定程度上缓解60Hz下垂直同步带来的延迟问题&#xff0c;但并不能彻底避免。为给玩家带来更优质的游戏体验&#xff0c;多年前&#xff0c;NVIDIA推出了革命性的G-SYNC电竞显示器技术…

作者头像 李华
网站建设 2026/4/23 12:18:18

计算机SSM毕设实战-基于ssm的体育器材管理系统设计与实现基于Java+SSM的体育器材管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:12:10

基于JAVA的大学生兼职雇佣系统(11867)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/23 13:25:51

【Moltbot搭建教程】新手友好(含搜索接口集成)

大家好呀我是菲菲~~首先我们来了解一下&#xff1a;Moltbot&#xff08;原Clawdbot&#xff09;是一款开源个人AI助手框架&#xff0c;具备本地执行、联网交互、多模型适配的核心能力&#xff0c;被开发者称为“个人开源贾维斯”。其核心优势在于可自由集成各类接口&#xff0c…

作者头像 李华
网站建设 2026/4/23 10:16:08

赋能即时配送业务!智能同城跑腿平台源码系统功能全览

温馨提示&#xff1a;文末有资源获取方式 在竞争激烈的同城配送领域&#xff0c;一个智能、高效且可自主演进的数字化平台是制胜法宝。本文将全面介绍一款能够为您的跑腿业务注入强大动力的源码系统&#xff0c;详细列出其功能与特点&#xff0c;助您做出明智选择。源码获取方式…

作者头像 李华
网站建设 2026/4/23 10:19:39

ubuntu 安装docker

# 1. 删除之前的无效配置 sudo rm -f /etc/apt/keyrings/docker.gpg sudo rm -f /etc/apt/sources.list.d/docker.list# 2. 安装必要工具 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release# 3. 添加阿里云 GPG 密钥&#xff08;兼容 Docker 官方签…

作者头像 李华