【Leetcode 每日一题】3250. 单调数组对的数目 I
问题背景
给你一个长度为 n n n 的 正 整数数组 n u m s nums nums。
如果两个 非负 整数数组 ( a r r 1 , a r r 2 ) (arr_1, arr_2) (arr1,arr2) 满足以下条件,我们称它们是 单调 数组对:
两个数组的长度都是 n n n。
- a r r 1 arr_1 arr1 是单调 非递减 的,换句话说 a r r 1 [ 0 ] ≤ a r r 1 [ 1 ] ≤ . . . ≤ a r r 1 [ n − 1 ] arr_1[0] \le arr_1[1] \le ... \le arr_1[n - 1] arr1[0]≤arr1[1]≤...≤arr1[n−1]。
- a r r 2 arr_2 arr2 是单调 非递增 的,换句话说 a r r 2 [ 0 ] ≤ a r r 2 [ 1 ] ≤ . . . ≤ a r r 2 [ n − 1 ] arr_2[0] \le arr_2[1] \le ... \le arr_2[n - 1] arr2[0]≤arr2[1]≤...≤arr2[n−1]。
- 对于所有的 0 ≤ i ≤ n − 1 0 \le i \le n - 1 0≤i≤n−1 都有 a r r 1 [ i ] + a r r 2 [ i ] = = n u m s [ i ] arr_1[i] + arr_2[i] == nums[i] arr1[i]+arr2[i]==nums[i]。
请你返回所有 单调 数组对的数目。
由于答案可能很大,请你将它对 1 0 9 + 7 10 ^ 9 + 7 109+7 取余 后返回。
数据约束
- 1 ≤ n = n u m s . l e n g t h ≤ 2000 1 \le n = nums.length \le 2000 1≤n=nums.length≤2000
- 1 ≤ n u m s [ i ] ≤ 50 1 \le nums[i] \le 50 1≤nums[i]≤50
解题过程
周赛三四题的水准,两道题目只在数据规模上有差异,目前只能尝试写灵神题解的解释。
这题虽然对两个数组有要求,但是实际上只需要枚举其中一个数组的情况,把对另外一个数组中元素的要求当成约束就行。
根据动态规划缩小问题规模的思想:
- 原问题是下标 0 0 0 到 n − 1 n - 1 n−1中的单调数组对的个数,且 a r r 1 [ n − 1 ] = j = 0 , 1 , 2 , . . . , n u m s [ n − 1 ] arr_1[n−1] = j = 0, 1, 2, ..., nums[n - 1] arr1[n−1]=j=0,1,2,...,nums[n−1]。
- 子问题是下标 0 0 0 到 i i i 中的单调数组对的个数,且 a r r 1 [ i ] = j arr_1[i] = j arr1[i]=j,将其记作 d p [ i ] [ j ] dp[i][j] dp[i][j]。
用 k k k表示 a r r 1 [ i − 1 ] arr_1[i−1] arr1[i−1],那么根据约束条件: { a r r 1 [ i − 1 ] ≤ a r r 1 [ i ] a r r 2 [ i − 1 ] ≥ a r r 2 [ i ] \ \begin{cases} arr_1[i - 1] \le arr_1[i] \\ arr_2[i - 1] \ge arr_2[i] \\ \end{cases} {arr1[i−1]≤arr1[i]arr2[i−1]≥arr2[i],即 { k ≤ j n u m s [ i − 1 ] − k ≥ n u m s [ i ] − j \ \begin{cases} k \le j \\ nums[i - 1] - k \ge nums[i] - j \\ \end{cases} {k≤jnums[i−1]−k≥nums[i]−j,可以得到 k k k 的上界。
解得 k ≤ m i n ( j , n u m s [ i − 1 ] − n u m s [ i ] + j ) = j + m i n ( n u m s [ i − 1 ] − n u m s [ i ] , 0 ) k \le min(j, nums[i - 1] - nums[i] + j) = j + min(nums[i - 1] - nums[i], 0) k≤min(j,nums[i−1]−nums[i]+j)=j+min(nums[i−1]−nums[i],0),由于所有数组中的元素都是非负的,而 n u m s [ i ] = a r r 1 [ i ] + a r r 2 [ i ] nums[i] = arr_1[i] + arr_2[i] nums[i]=arr1[i]+arr2[i],所以 k ≤ n u m s [ i − 1 ] k \le nums[i - 1] k≤nums[i−1]。
记 m a x K = j + m i n ( n u m s [ i − 1 ] − n u m s [ i ] , 0 ) maxK = j + min(nums[i - 1] - nums[i], 0) maxK=j+min(nums[i−1]−nums[i],0),那么 d p [ i ] [ j ] = { 0 , m a x K < 0 Σ k = 0 m a x K d p [ i − 1 ] [ k ] , m a x K ≥ 0 dp[i][j] = \begin{cases} 0,& maxK \lt 0 \\ \mathop{\Sigma} \limits _ {k = 0} ^ {maxK} dp[i - 1][k],& maxK \ge 0 \\ \end{cases} dp[i][j]=⎩ ⎨ ⎧0,k=0ΣmaxKdp[i−1][k],maxK<0maxK≥0。
这里 Σ k = 0 m a x K d p [ i − 1 ] [ k ] \mathop{\Sigma} \limits _ {k = 0} ^ {maxK} dp[i - 1][k] k=0ΣmaxKdp[i−1][k] 表示对所有的 k k k 从 0 0 0 到 m a x K maxK maxK 的情况,求下标 0 0 0 到 i − 1 i - 1 i−1 中的单调数组对的个数之和,要求 a r r 1 = k arr_1 = k arr1=k。这显然满足前缀和的定义,记 s [ j ] = Σ k = 0 j d p [ i − 1 ] [ k ] s[j] = \mathop{\Sigma} \limits _ {k = 0} ^ {j} dp[i - 1][k] s[j]=k=0Σjdp[i−1][k],那么上述状态转移方程 ( 3 ) (3) (3) 可以简化为 d p [ i ] [ j ] = { 0 , m a x K < 0 s [ m a x K ] , m a x K ≥ 0 dp[i][j] = \begin{cases} 0,& maxK \lt 0 \\ s[maxK],& maxK \ge 0 \\ \end{cases} dp[i][j]={0,s[maxK],maxK<0maxK≥0。
初始值 d p [ 0 ] [ j ] = 1 dp[0][j] = 1 dp[0][j]=1,其中 j = 0 , 1 , 2 , . . . , n u m s [ 0 ] j = 0, 1, 2, ..., nums[0] j=0,1,2,...,nums[0]。这表示的是,下标 0 0 0 到 0 0 0 中的单调数组对的个数,也就是只考虑数组中第一个元素的情况, a r r 1 [ i ] arr_1[i] arr1[i] 可以是合法范围内任意值。
后续还有进一步优化,目前一下子掌握不了,先暂时放弃。
具体实现
class Solution {// 根据题意定义模数private static final int MOD = 1000000007;public int countOfPairs(int[] nums) {int n = nums.length;// m 表示 nums 数组中的最大值,所有数组中的元素都不会超过这个范围,也就是应枚举的最大值int m = Arrays.stream(nums).max().getAsInt();long [][] dp = new long[n][m + 1];long[] preSum = new long[m + 1];// 填充初始值,只考虑数组中第一个元素的情况Arrays.fill(dp[0], 0, nums[0] + 1, 1);for(int i = 1; i < n; i++) {// 计算前缀和,这是它的定义preSum[0] = dp[i - 1][0];for(int k = 1; k <= m; k++) {preSum[k] = (preSum[k - 1] + dp[i - 1][k]) % MOD;}for(int j = 0; j <= nums[i]; j++) {int maxK = j + Math.min(nums[i - 1] - nums[i], 0);dp[i][j] = maxK >= 0 ? preSum[maxK] % MOD : 0;}}// 答案是考虑完数组中最后一个元素之后,对所有可能情形求和return (int) (Arrays.stream(dp[n - 1], 0, nums[n - 1] + 1).sum() % MOD);}
}
相关文章:
【Leetcode 每日一题】3250. 单调数组对的数目 I
问题背景 给你一个长度为 n n n 的 正 整数数组 n u m s nums nums。 如果两个 非负 整数数组 ( a r r 1 , a r r 2 ) (arr_1, arr_2) (arr1,arr2) 满足以下条件,我们称它们是 单调 数组对: 两个数组的长度都是 n n n。 a r r 1 arr_1 arr1 是…...
较类中的方法和属性比较
在 Python 中,类中有以下几种常见的方法和属性,它们的作用和用法有所不同。以下是详细比较: --- ### **1. 实例方法** - **定义**:使用 def 定义,第一个参数是 self,表示实例对象本身。 - **作用**&#…...
nVisual可视化资源管理工具
nVisual主要功能 支持自定义层次化的场景结构 与物理世界结构一致,从全国到区域、从室外到室内、从机房到设备。 支持自定义多种空间场景 支持图片、CAD、GIS、3D等多种可视化场景搭建。 丰富的模型库 支持图标、机柜、设备、线缆等多种资源对象创建。 资源可…...
自动类型推导(auto 和 decltype)
一、auto关键字 基本概念 在 C 11 中引入了auto关键字用于自动类型推导。它可以让编译器根据变量的初始化表达式自动推断出变量的类型。这在处理复杂的类型,如迭代器、lambda 表达式的类型等情况时非常有用。 使用示例 例如,在迭代器的使用中…...
新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型
前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…...
基于投影寻踪博弈论-云模型的滑坡风险评价
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于投影寻踪博弈论-云模型的滑坡风险评价 基于投影寻踪博弈论-云模型的滑坡风险评价是一个复杂而有趣的主题,涉及到博弈论、风险评估和模糊逻辑等领域的交叉应用。这个方法结合了博弈论中的投影寻踪技术…...
WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法
大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的,也是区域的,甚至是全球的。本地的污染物排放除了对当地造成严重影响外,同时还会在…...
Spring中每次访问数据库都要创建SqlSession吗?
一、SqlSession是什么二、源码分析1)mybatis获取Mapper流程2)Spring创建Mapper接口的代理对象流程3)MapperFactoryBean#getObject调用时机4)SqlSessionTemplate创建流程5)SqlSessionInterceptor拦截逻辑6)开…...
力扣刷题TOP101:6.BM7 链表中环的入口结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑(Floyd 判圈算法)的延续版:乌龟愤愤不平地举报兔子跑得太快,偷偷…...
浅谈telnet和ping
telnet 和 ping 是网络诊断工具,用于测试网络连接性和故障排查,但它们有不同的用途和功能。以下是它们的主要区别: 1. ping 功能描述 用途:ping 命令用于测试主机与目标地址(IP或域名)之间的连通性。工作…...
P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组
知识要点:字符数组 视频: P4-3【应用数组进行程序设计 | 第三节】——知识要点:字符数组 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求输入一行字符,统计其中的单词数,单词之间用…...
彻底理解微服务配置中心的作用
常见的配置中心有SpringCloudConfig、Apollo、Nacos等,理解它的作用,无非两点,一是配置中心能做什么,不使用配置中心会出现什么问题。 作用:配置中心是用来集中管理服务的配置,它是用来提高系统配置的维护…...
SpringBoot开发——详细讲解 Spring Boot 项目中的 POM 配置
文章目录 一、POM 文件简介二、单模块项目的 POM 配置1. 创建基本的 Spring Boot 单模块项目2. 重点解析三、多模块项目的 POM 配置1. 多模块项目结构2. 父模块 POM 文件3. 子模块 POM 文件4. 重点解析结语在 Spring Boot 项目中,POM(Project Object Model)文件起着关键作用…...
pyspark实现基于协同过滤的电影推荐系统
最近在学一门大数据的课,课程要求很开放,任意做一个大数据相关的项目即可,不知道为什么我就想到推荐算法,一直到着手要做之前还没有新的更好的来代替,那就这个吧。 推荐算法 推荐算法的发展由来已久,但和…...
视觉语言模型(VLM)学习笔记
目录 应用场景举例 VLM 的总体架构包括: 深度解析:图像编码器的实现 图像编码器:视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑:你输入 “生成一张…...
学习笔记:黑马程序员JavaWeb开发教程(2024.11.29)
10.5 案例-部门管理-新增 如何接收来自前端的数据: 接收到json数据之后,利用RequestBody注解,将前端响应回来的json格式的数据封装到实体类中 对代码中Controller层的优化 发现路径中都有/depts,可以将每个方法对应请求路径中的…...
文档加密怎么做才安全?
公司的文档包含很多机密文件,这些文件不仅关乎公司的核心竞争力,还涉及到客户隐私、商业策略等敏感信息。因此,文档的保管和传递一直是我们工作的重中之重。 为了确保机密文件的安全,公司需要制定了一系列严格的保密措施。从文件的…...
使用Setup Factory将C#的程序打包成安装包
一、软件下载 https://download.csdn.net/download/qq_65356682/90042701 可以直接下载 二、软件使用 打开 1、创建一个新的项目 2、设置如下信息,也可以不设置,最好填非空的、 产品名就是你安装成功后生成文件的名称 3、如下文件夹路径就是你C#中ex…...
解决 java -jar 报错:xxx.jar 中没有主清单属性
问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…...
Java HashSet 介绍
怀旧网个人博客网站地址:怀旧网,博客详情:Java HashSet 介绍 哈希值介绍 创建一个实体类 public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;} }使用测试…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
