2024.1.19力扣每日一题——使数组和小于等于 x 的最少时间

2024.1.19

      • 题目来源
      • 我的题解
        • 方法一 动态规划
        • 方法二 动态规划(空间优化)

题目来源

力扣每日一题;题序:2809

我的题解

题解参考官方题解。

方法一 动态规划

若能找到一个最小的时间t使得数组和小于等于x,则最多在一轮遍历(n秒)中找到,否则就找不到。所以观察重置为零的数,会按照 nums2的速度增长,所以对于所有操作的数,我们应该优先操作增长速度慢的数。
如果我们选择多个索引 i 1 , i 2 , … , i k i_1,i_2,…,i_k i1,i2,,ik,那么按照 n u m s 2 [ i 1 ] ≤ n u m s 2 [ i 2 ] ≤ … ≤ n u m s 2 [ i k ] nums_2[i_1]≤nums_2[i_2]≤…≤nums_2[i_k] nums2[i1]nums2[i2]nums2[ik]的顺序进行设置是最优的。按照 nums2 的大小对所有数值对进行排序(非递减顺序)。用 dp[j][i] 表示如果对前 j个元素进行 i次操作,可以减少的最大总值,初始值为零。对于第 j 个元素,我们可以选择对其进行操作或者不操作,由此可以得到状态转移方程:
dp[j][i]=max⁡(dp[j−1][i],dp[j−1][i−1]+ n u m s 2 nums_2 nums2[j−1]×i+ n u m s 1 nums_1 nums1[j−1])
其中有 1≤i≤j≤n。
最后返回最小的 t,使满足 sum( n u m s 1 nums_1 nums1)+sum( n u m s 2 nums_2 nums2)×t−dp[n][t]≤x,如果不存在返回 −1。

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O( n 2 n^2 n2)。动态规划数组空间

public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {int n = nums1.size(), s1 = 0, s2 = 0;int[][] dp = new int[n + 1][n + 1];//这里是技巧:如何不改变原数组对其进行排序Integer index[]=new Integer[nums2.size()];for(int i=0;i< nums2.size();i++){index[i]=i;}Arrays.sort(index,(a,b)->nums2.get(a)-nums2.get(b));for (int i = 0; i < n; i++) {int a = nums1.get(i), b = nums2.get(i);s1 += a;s2 += b;}for (int j = 1; j <= n; ++j) {int in=index[j-1];int b = nums2.get(in), a = nums1.get(in);for (int i = j; i > 0; --i) {dp[j][i] = Math.max(dp[j - 1][i], dp[j - 1][i - 1] + i * b + a);}}for (int i = 0; i <= n; i++) {if (s2 * i + s1 - dp[n][i] <= x) {return i;}}return -1;
}
方法二 动态规划(空间优化)

dp[i] 的状态只和 dp[i−1]有关。
所以可以省去第一个维度,从而优化空间,从 O( n 2 n^2 n2) 优化到 O(n),其中 n 是输入数组的长度。

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(n)

public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {int n = nums1.size(), s1 = 0, s2 = 0;int[] dp = new int[n + 1];Integer index[]=new Integer[nums2.size()];for(int i=0;i< nums2.size();i++){index[i]=i;}Arrays.sort(index,(a,b)->nums2.get(a)-nums2.get(b));for (int i = 0; i < n; i++) {int a = nums1.get(i), b = nums2.get(i);s1 += a;s2 += b;}for (int j = 1; j <= n; ++j) {int in=index[j-1];int b = nums2.get(in), a = nums1.get(in);for (int i = j; i > 0; --i) {dp[i] = Math.max(dp[i], dp[i - 1] + i * b + a);}}for (int i = 0; i <= n; i++) {if (s2 * i + s1 - dp[i] <= x) {return i;}}return -1;
}

注意技巧:如何在不改变原数组的情况下对数组进行排序,需要额外的序号数组

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dubbo 3.2版本分析Provider启动时操作

Dubbo 3.2版本分析Provider启动时操作 前言例子分析onStarting 模块doStart 模块 小结 前言 上一篇文章&#xff0c;我们分析了 Dubbo 3.2 版本在 Provider 启动前的操作流程&#xff0c;这次我们具体分析具体它的启动过程&#xff0c;揭开它的神秘面纱。 例子 这里我们还是…

【ZYNQ入门】第八篇、基于Lwip构建TCP服务器

目录 第一部分、基础知识 1、小白入门必看文章 2、什么是Lwip&#xff1f; 3、什么是TCP/IP协议&#xff1f; 4、MAC地址、IP地址、子网掩码、网关 4.1、MAC地址 4.2、IP地址 4.3、子网掩码 4.4、网关 第二部分、硬件搭建 第三部分、软件代码 1、SDK工程的建立 2、…

数据结构与算法-二叉树-从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

云盘后端分析

1.验证码 用的是外面找的 2.发送邮箱验证码 配置邮箱的授权码 我们在发送邮箱的时候&#xff0c;需要把那个值传到数据库中&#xff0c;数据库中有它的状态&#xff0c;我们需要根据状态判断它是注册还是找回密码 我们在发送邮箱之前&#xff0c;先从session里面得到我们验证…

Rocky Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

某度网盘提取下载链接JS逆向分析(一)

本次目标网址如下&#xff0c;使用base64解码后获得 aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMUZsaDBPeGpZamZJTFVZWUQzTm9fVnc 链接提取码为&#xff1a;ly12 本次逆向分析分为上下两篇文章说明&#xff0c;一为讲解如何从原链接通过逆向拿到下载链接&#xff0c;二为逆向登录拿到co…

flink结合Yarn进行部署

1. 什么是Yarn模式部署Flink 独立&#xff08;Standalone&#xff09;模式由 Flink 自身提供资源&#xff0c;无需其他框架&#xff0c;这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但我们知道&#xff0c;Flink 是大数据计算框架&#xff0c;不是资…

编程笔记 html5cssjs 044 CSS显示

编程笔记 html5&css&js 044 CSS显示 一、display 属性二、块级元素&#xff08;block element&#xff09;三、行内元素&#xff08;inline element&#xff09;四、disply属性设置&#xff08;一&#xff09;Display: none;&#xff08;二&#xff09;覆盖默认的 Disp…

C++学习笔记——指针

1&#xff0c;指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存的编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 上图中的p就是a变量的指针&#xff0c;也可以记作*a 2&#xff0c;指针变量的定义和使用 指针变量定…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

3.RHCSA脚本配置及通过node2改密码

运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分.

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…

集成显卡和普通显卡的区别?

问题描述&#xff1a;集成显卡和普通显卡的区别&#xff1f; 问题解答&#xff1a; 集成显卡和独立显卡&#xff08;普通显卡&#xff09;是两种不同类型的图形处理单元&#xff0c;它们在计算机系统中负责处理图形和视频输出&#xff0c;但它们有一些关键的区别&#xff1a;…

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路&#xff1a;方程&#xff1a; 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…

Threejs实现立体3D园区解决方案及代码

一、实现方案 单独贴代码可能容易混乱&#xff0c;所以这里只讲实现思路&#xff0c;代码放在最后汇总了下。 想要实现一个简单的工业园区、主要包含的内容是一个大楼、左右两片停车位、四条道路以及多个可在道路上随机移动的车辆、遇到停车位时随机选择是否要停车&#xff0…

解决ssh登录Permission denied, please try again

现象截图如下&#xff1a; 确定root的密码是正确的&#xff0c;最后的原因找到了&#xff0c;是远程的服务器&#xff0c;禁用了root账户可以被远程访问的权限。开启操作如下&#xff1a; 1.编辑配置文件 vi /etc/ssh/sshd_config 2.文件中找到PermitRootLogin #PermitRoo…

seaborn可视化示例详解

目录 1、散点图 2、散点图回归线 3、折线图 4、频数柱状图 5、分组散点图 6、箱型图 7、数值分布柱状图 8、频数分布图 9、联合分布图 10、数值分布柱状图 11、相关系数热力图 划重点 少走10年弯路 Seaborn是一个基于Python的数据可视化库&#xff0c;Seaborn提供了许多用…

8-Docker网络命令之ls

1.ls介绍 docker网络命令ls是用来列出当前docker中默认的及自定义的网络 2.ls用法 docker network ls [参数] [root@centos79 ~]# docker network ls --helpUsage: docker network ls [OPTIONS]List networksAliases:docker network ls, docker network listOptions:-f, -…

链表|数据结构|C语言深入学习

什么是链表 离散&#xff0c;就是“分离的、散开的” 链表是什么样子的&#xff1a; 有限个节点离散分配 彼此间通过指针相连 除了首尾节点&#xff0c;每个节点都只有一个前驱节点和一个后继节点 首节点没有前驱结点&#xff0c;尾节点没有后继节点 基本概念术语&#xf…

C 练习实例38

题目&#xff1a;求一个3*3矩阵对角线元素之和 程序分析&#xff1a;利用双重for循环控制输入二维数组&#xff0c;再将a[i][i]累加后输出。 代码&#xff1a; #include <stdio.h> int main() {int a[3][3];int i; //行序列int j; //列序列int k; //对角线序列int cnt…