当前位置: 首页 > news >正文

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP+贪心+正难则反)

  • Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP 好题)
  • 题目
    • 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒,对于所有下标 0 <= i < nums1.length ,nums1[i] 的值都增加 nums2[i] 。操作 完成后 ,你可以进行如下操作:
      • 选择任一满足 0 <= i < nums1.length 的下标 i ,并使 nums1[i] = 0 。
    • 同时给你一个整数 x 。
    • 请你返回使 nums1 中所有元素之和 小于等于 x 所需要的 最少 时间,如果无法实现,那么返回 -1 。
    • 1 <= nums1.length <= 10 ^ 3
    • 1 <= nums1[i] <= 10 ^ 3
    • 0 <= nums2[i] <= 10 ^ 3
    • nums1.length == nums2.length
    • 0 <= x <= 10 ^ 6
  • 解法
    • DP+贪心+正难则反:
    • 第 1 步:
    • 每个 nums1[i] 置为 0,超过一次不如仅最后一次置为 0,
    • 可知对于 nums1[i] 一样大,且不会影响其他 nums1,
    • 因此时间最多就是 nums1.len、超过则无意义,
    • 第 2 步:
    • 问题转化为经过最少 s 秒且 s <= nums1.len,使得 nums3 = nums2[x]*(s-1) + nums2[y]*(s-2) + … + nums2[z]*0 + nums1[a] + …,nums3.len = nums1.len
    • nums3 总和 sum(nums3) 小于等于 x 时,最小的 s 就是答案,否则答案就是 -1,
    • 同时不可能推出 s 单调性,因此无法二分答案,
    • 第 3 步:
    • 正面直接求最小值无法想到什么贪心策略,如果使用 DP 则第 j+1 秒会影响前 j 秒的数据,因为每秒每个元素会加上 nums2,不满足无后效性
    • 正难则反:
      • 求经过 s 秒最多可以减少多少
      • 总数 sum(nums1) + s*sum(nums2) 减去即可
    • 第 4 步:
    • 动规状态:dp[i][j] 为前 i 个数经过 j 秒最多可以减少多少,注意 i>=j,
    • 初始化 dp[i][0]=0,即前 i 个数不经过任何时间则无法减少
    • 第 5 步
    • 转移方程:dp[i][j]=max(dp[i-1][j], dp[i-1][j-1] + nums1[i-1]+j*nums2[i-1]),
      • 即第 i 个数经过 j 秒是否删除的最大值,取决于是否需要再第 j 秒清理掉第 i 个元素
      • 此时 DP 无后效性,因为第 i+1 个数不会影响前 i 个数的更新,
      • 同时需要满足减少 j 个元素的最大值、等于减少前(i-1 个元素中选 j-1 个元素)的最大值加第 i 个元素,
      • 可以观察减少的是 nums1[i-1]+j*nums2[i-1],由于前 j 秒等价于选 j 个元素,此时 nums1 顺序无所谓,j 固定升序、保证 j*nums2[i-1] 最大需要使 nums2 升序(nums1 跟随排序)
    • 第 6 步:
    • 最后结果就是枚举秒数 j=[0,nums1.len],sum(nums1) + j * sum(nums2) - dp[nums1.len][j] <= x,找到最小的 j,没有则返回 -1
    • 空间压缩:由于 dp[i][j] 仅与 dp[i-1][j]、dp[i-1][j-1] 有关,因此可以使用一维 dp[j] 倒序处理
    • 时间复杂度:O(n ^ 2),空间复杂度:O(n)
  • 代码
/*** DP+贪心+正难则反:** 第 1 步:* 每个 nums1[i] 置为 0,超过一次不如仅最后一次置为 0,* 可知对于 nums1[i] 一样大,且不会影响其他 nums1,* 因此时间最多就是 nums1.len、超过则无意义,** 第 2 步:* 问题转化为经过最少 s 秒且 s <= nums1.len,使得 nums3 = nums2[x]*(s-1) + nums2[y]*(s-2) + ... + nums2[z]*0 + nums1[a] + ...,nums3.len = nums1.len* nums3 总和 sum(nums3) 小于等于 x 时,最小的 s 就是答案,否则答案就是 -1,* 同时不可能推出 s 单调性,因此无法二分答案,** 第 3 步:* 正面直接求最小值无法想到什么贪心策略,如果使用 DP 则第 j+1 秒会影响前 j 秒的数据,因为每秒每个元素会加上 nums2,**不满足无后效性**,* 正难则反:*     * 求经过 s 秒最多可以减少多少*     * 总数 sum(nums1) + s*sum(nums2) 减去即可** 第 4 步:* 动规状态:dp[i][j] 为前 i 个数经过 j 秒最多可以减少多少,注意 i>=j,* 初始化 dp[i][0]=0,即前 i 个数不经过任何时间则无法减少** **第 5 步**:* 转移方程:dp[i][j]=max(dp[i-1][j], dp[i-1][j-1] + nums1[i-1]+j*nums2[i-1]),*     * 即第 i 个数经过 j 秒是否删除的最大值,取决于是否需要再第 j 秒清理掉第 i 个元素*     * **此时 DP 无后效性**,因为第 i+1 个数不会影响前 i 个数的更新,*     * 同时需要满足减少 j 个元素的最大值、等于减少前(i-1 个元素中选 j-1 个元素)的最大值加第 i 个元素,*     * 可以观察减少的是 nums1[i-1]+j*nums2[i-1],由于前 j 秒等价于选 j 个元素,此时 nums1 顺序无所谓,**j 固定升序、保证 j*nums2[i-1] 最大需要使 nums2 升序(nums1 跟随排序)**** 第 6 步:* 最后结果就是枚举秒数 j=[0,nums1.len],sum(nums1) + j * sum(nums2) - dp[nums1.len][j] <= x,找到最小的 j,没有则返回 -1* 空间压缩:由于 dp[i][j] 仅与 dp[i-1][j]、dp[i-1][j-1] 有关,因此可以使用一维 dp[j] 倒序处理* 时间复杂度:O(n ^ 2),空间复杂度:O(n)*/public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {// 判空与异常if (nums1 == null || nums2 == null || nums1.size() != nums2.size() || nums1.size() <= 0) {return -1;}int n = nums1.size();// 求总和int sumNums1 = nums1.stream().mapToInt(Integer::intValue).sum();int sumNums2 = nums2.stream().mapToInt(Integer::intValue).sum();
//        System.out.println(sumNums1);
//        System.out.println(sumNums2);// j 固定升序、保证 j*nums2[i-1] 最大需要使 nums2 升序(nums1 跟随排序)List<Pair<Integer, Integer>> numsPair = new ArrayList<>(n);for (int i = 0; i < n; i++) {numsPair.add(new Pair<>(nums2.get(i), nums1.get(i)));}Collections.sort(numsPair, (o1, o2) -> o1.getKey() - o2.getKey());
//        System.out.println(numsPair);// 动规状态:dp[i][j] 为前 i 个数经过 j 秒最多可以减少多少,注意 i>=j,初始化 dp[i][0]=0,即前 i 个数不经过任何时间则无法减少,空间压缩掉 iint[] dp = new int[n + 1];// 转移方程:dp[i][j]=max(dp[i-1][j], dp[i-1][j-1] + nums1[i-1]+j*nums2[i-1]),for (int i = 1; i < n + 1; i++) {// 空间压缩,一维 dp[j] 倒序处理for (int j = i; j >=1; j--) {dp[j] = Math.max(dp[j], dp[j-1] + numsPair.get(i-1).getValue() + j * numsPair.get(i-1).getKey());}}
//        AlgorithmUtils.systemOutArray(dp);int res = -1;// 枚举秒数 j=[0,nums1.len],sum(nums1) + j * sum(nums2) - dp[nums1.len][j] <= x,找到最小的 j,没有则返回 -1for (int j = 0; j <= n; j++) {if (sumNums1 + j * sumNums2 - dp[j] <= x) {res = j;break;}}return res;}

相关文章:

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP+贪心+正难则反)

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间&#xff08;DP 好题&#xff09;题目 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 num…...

已知数组A[1..n]中元素类型为非负整数,设计算法将其调整为左右两部分,左边所有为奇数,右边所有为偶数,并要求算法的时间复杂度为O(n)

//左边奇数右边偶数 void Swap(int* a, int* b) {int tmp *b;*b *a;*a tmp; } void LeftRight(int arr[],int n) {int i 0;int j n - 1;while(i<j){if (arr[i] % 2 0 && arr[j] % 2 1) {Swap(&arr[i], &arr[j]);i;j--;}else if (arr[i] % 2 1 &…...

ssm+vue的罪犯信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的罪犯信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

Java/Android 各类型数据构造和各类型数据解析

Java/Android 各类型数据构造和各类型数据解析 1.如何构造/解析{"key":"value","key":"value","key":"value"}jsonString1)json解析2)fastjson解析3)Gson解析4)遍历key值解析2.如何构造/解析[{"key&q…...

Linux系统---环境变量+内核进程调度队列(选学)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、环境变量 1.基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c…...

Kubernetes 使用插件扩展 kubectl

例子演示 编写 kubectl-foo &#xff0c;拷贝至 /usr/local/bin/ #!/bin/bash# 可选的参数处理 if [[ "$1" "version" ]] thenecho "1.0.0"exit 0 fi# 可选的参数处理 if [[ "$1" "config" ]] thenecho $KUBECONFIGexit…...

前端面试题09

74、定义类的方法有哪些 在JavaScript中&#xff0c;定义类的方法有以下几种方式&#xff1a; 1.使用函数声明&#xff1a; function MyClass() {// constructor } MyClass.prototype.methodName function() {// method body };2.使用类的方法缩写&#xff08;ES6引入&…...

网站更换IP的四大注意事项

1.对网站当中的数据进行备份 网站更换IP时可以将页面的数据库文件和站点文件通过下载工具在本地完成备份。 2.更换解析域名 从站点域名管理后台当中更换域名地址&#xff0c;改为新的IP地址。 3.确保IP安全 在用户更换IP前一定要确定IP是否安全&#xff0c;一旦IP存在不良…...

策略模式与简单工厂模式:终结if-else混乱,让代码更清爽

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4500多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…...

TCP三次握手过程

什么是TCP tcp是一个面向连接的、可靠的、基于字节流的传输层通信协议 面向连接&#xff1a;TCP连接是一对一的&#xff0c;不能实现一对多或多对一&#xff0c;TCP在通信前要首先建立连接&#xff0c;连接成功后才能开始进行通信可靠的&#xff1a;TCP连接要保证通信过程的可靠…...

04-配置远程仓库的SSH免密登陆

配置SSH免密登录 配置步骤 创建好的远程仓库也可以使用SSH的方式进行访问,但如果没有配置公钥会有警告 第一步: 删除用户家目录下的.ssh目录,如果没有该目录或者该目录下已经有密钥了就不用执行该操作 #进入当前用户的家目录,删除.ssh 目录 LayneLAPTOP-Layne MINGW64 ~ $ r…...

【中文编码】利用bert-base-chinese中的Tokenizer实现中文编码嵌入

最近接触文本处理&#xff0c;查询了一些资料&#xff0c;记录一下中文文本编码的处理方法吧。   先下载模型和词表&#xff1a;bert-base-chinese镜像下载   如下图示&#xff0c;下载好的以下文件均存放在 bert-base-chinese 文件夹下    1. 词编码嵌入简介 按我通俗的…...

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前&#xff0c;我们必须首先清楚msxml3.dll到底是什么。DLL&#xff08;Dynamic Link Libraries&#xff09;文件是Windows操作系统使用的一个重要组成部分&#xff0c;用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…...

《React 知识点》第一篇 大括号使用{}

简介 大括号 " {} "可以用于包裹JavaScript的表达式或语句。以便在jsx中动态生成内容。 插入变量与表达式 function expressionTest() {const name "变量测试";return (<p><div>{name}</div><div>表达式 210 {2 100}</div…...

kafka入门(二): 位移提交

位移提交&#xff1a; Kafka的每条消息都有唯一的 offset&#xff0c; 用来表示消息在分区中对应的位置。有的也称之为 “偏移量”。 消费者每次在 poll() 拉取消息&#xff0c;它要返回的是还没有消费过的消息集&#xff0c; 因此&#xff0c;需要记录上一次消费时的消费位…...

PG时间计算

PG数据库&#xff0c;时间计算使用场景总结 日期之差 --**获取秒差** SELECT round(date_part(epoch, TIMESTAMP 2019-05-05 12:11:20 - TIMESTAMP 2019-05-05 10:10:10)); --**获取分钟差** SELECT round(date_part(epoch, TIMESTAMP 2019-05-05 12:11:20 - TIMESTAMP 20…...

基于51单片机的交通灯_可调时间_夜间+紧急模式

51单片机交通灯 1 讲解视频&#xff1a;2 功能要求3 仿真图&#xff1a;4 原理图PCB5 实物图6 程序设计&#xff1a;7 设计报告8 资料清单&#xff08;提供资料清单所有文件&#xff09;&#xff1a;设计资料下载链接&#xff1a; 51单片机简易交通灯_可调时间_夜间紧急 仿真代…...

网络通信原理,进制转化总结

来源&#xff0c;做个笔记&#xff0c;讲的还蛮清楚通信原理-2.5 数据封装与传输05_哔哩哔哩_bilibili ip地址范围...

西南科技大学(数据结构A)期末自测练习三

一、填空题&#xff08;每空1分&#xff0c;共10分&#xff09; 1、为解决计算机主机与打印机之间速度不匹配的问题&#xff0c;通常设置一个打印数据缓冲区。主机将要输出的数据依次写入缓冲区&#xff0c;打印机则依次从缓冲区中取出数据&#xff0c;则该换缓冲区的逻辑结构…...

【halcon】裁剪

前言 目前我遇到的裁剪相关的函数都是以clip打头的函数。一共4个&#xff1a; clip_end_points_contours_xldclip_contours_xldclip_regionclip_region_rel 前面两个是对轮廓的裁剪。 后面是对区域的裁剪。 裁剪轮廓的两端 clip_end_points_contours_xld 用于实现裁剪XLD…...

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB 代码复现&#xff08;文献代码&#xff09;协同控制 规划 无人机 研究了基于二次规划的安全关键型多智能体系统的控制问题。 每个被控智能体被建模为一个积分器和一个不确定非线性驱动系统的级联…...

移动端ncnn部署YOLOv11:从官方转换到实战排错

1. 移动端部署YOLOv11的完整流程 在移动端部署YOLOv11模型&#xff0c;ncnn无疑是最佳选择之一。这个轻量级的高性能神经网络前向计算框架&#xff0c;专为移动端优化设计。我最近刚完成一个项目&#xff0c;需要把YOLOv11部署到安卓设备上&#xff0c;整个过程虽然踩了不少坑…...

解密Abaqus许可证“心跳”机制与合理超时时间设置

解密Abaqus许可证“心跳”机制跟合理超时时间设置你是不单是也碰到过这种情况&#xff1a;Abaqus许可证明明用不了&#xff0c;可系统还在继续计费&#xff1f;我在一家制造企业做许可证优化&#xff0c;就碰到了此老问题。为何许可证会“死掉”&#xff1f;这跟许可证的心跳&a…...

Phi-4-mini-reasoning实用刚需:3.8B模型在边缘服务器部署可行性分析

Phi-4-mini-reasoning实用刚需&#xff1a;3.8B模型在边缘服务器部署可行性分析 1. 模型概述与核心优势 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型最突出的特点是"小参数、强推理…...

50 岁苹果:变与不变的科技传奇

从车库小作坊到行业巨头&#xff1a;苹果早期的革命之路1976 年&#xff0c;在科技巨头普遍认为电脑仅供企业和政府使用时&#xff0c;乔布斯和沃兹尼亚克在车库用零件组装出 Apple I&#xff0c;虽像半成品却为苹果拿到启动资金。次年的 Apple II 才是关键&#xff0c;它是第一…...

ai辅助开发新思路:让快马ai为你生成一个notepad++智能编程助手插件原型

今天想和大家分享一个有趣的AI辅助开发思路——如何用InsCode(快马)平台快速构建一个Notepad智能编程助手插件的原型。这个项目特别适合想体验AI与本地编辑器联动的开发者&#xff0c;整个过程不需要复杂的配置&#xff0c;直接在网页上就能完成原型验证。 插件功能设计 这个插…...

美元、日元、欧元怎么选?外汇新手该从哪个货币对开始?

最近有不少刚接触外汇交易的朋友问我同一个问题&#xff1a;美元、日元、欧元这些主流货币到底该怎么选&#xff1f;作为一个过来人&#xff0c;我想说的是——选对起步品种&#xff0c;比你想象中重要得多。 很多新手一上来就想着“赚快钱”&#xff0c;直接冲进波动剧烈的交叉…...

3步攻克m3u8视频下载:零基础解决方案

3步攻克m3u8视频下载&#xff1a;零基础解决方案 【免费下载链接】m3u8_downloader 项目地址: https://gitcode.com/gh_mirrors/m3/m3u8_downloader 在数字化时代&#xff0c;流媒体内容已成为信息传播的主要形式之一。然而&#xff0c;许多在线视频采用m3u8格式并通过…...

windows系统安装gitblit经验分享

1、下载gitblithttp://www.gitblit.com/下载解压后如下图所示&#xff1a;2、安装与配置&#xff08;1&#xff09;修改data/defaults.properties#git仓库地址git.repositoriesFolder E:/GitRepo/git# 配置http访问端口server.httpPort 8090# 配置http访问git时的IP地址serve…...

AI机器视觉+振镜控制:基于OpenCV的无序工件全自动定位打标

引言 工业激光打标场景中,无序工件的定位难题一直制约着自动化产能提升——传统工装定位换型成本高、人工摆料误差大,固定视觉方案无法适配工件360旋转姿态。本文提出一套基于OpenCV机器视觉+振镜联动的全自动定位打标方案,无需专用工装,通过AI视觉实现无序工件亚像素级定位…...