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

1187.使数组严格递增 学习记录

题目描述

给你两个整数数组 arr1arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。

每一步「操作」中,你可以分别从 arr1arr2 中各选出一个索引,分别为 i 和 j0 <= i < arr1.length 和 0 <= j < arr2.length,然后进行赋值运算 arr1[i] = arr2[j]

如果无法让 arr1 严格递增,请返回 -1。

不会解,看题解之前没有可靠的思路

学习总结

思路总结

  • 提炼关键信息
    • 使数组arr1严格递增,可以得到
      • 目的是替换之后使数组arr1严格递增,所以不能有重复元素
      • 选择数组arr2中的元素进行替换,所以选择过程中不需要选择重复的元素进行替换
      • 总结:可以对数组arr2进行排序去重,方便操作
    • 以小窥大进行推导
      • n = arr1.length对于第[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjuDr1zj-1682003137788)(null#card=math&code=i&id=urrlT)]个元素,有两种选择
        • 替换
        • 不替换
      • 如何去思考?
        • 为了使数组严格递增那么,必须保证arr1[i] > arr1[i-1]
        • if arr1[i] > arr1[i-1]那么可以保留当前元素
        • 例外地:if arr1[i] > arr1[i-1] + 1
          • 当前元素可以被替换成严格大于arr1[i-1]的元素
          • ex:arr1 = [1, 5, 3, 6, 7] arr2 = [4, 3]5替换成3、3替换成4为满足题意的最优结果
        • 换言之,为了使数组严格递增,对于每一元素都需要进行两步操作
          • 是否大于其前一个元素
          • 是否能从已排序数组arr2(从小到大)中找到一个小于当前元素且大于arr1[i-1]的元素
      • 需要返回最小操作数
        • 直观地,对于每一个元素都进行替换的话,那么操作数是 n = arr1.length
        • 但是不一定有足够多的元素来提供使用
        • 最多能够替换几次?
          • 假设 n = 10 m = 20那么最多能够替换 10 次,因为有10个元素等待被替换
          • 假设 n = 20 m = 11 那么最多能够替换 11 次,因为有 11 次元素可以用来被替换
          • 所以 最多的替换次数 是 j = Math.min(n, m)
  • 如何求解最终结果
    • 通过学习题解了解到使用动态规划的方法
    • 自己为什么没想起来?
      • 还是太菜了,多学,多总结,多练

动态规划

思考角度——三个要素:状态、状态转移方程、边界确定

  • 状态
    • 从第一个元素开始,其是否选择交换是一个状态,每一个元素都会面临相同的情况
    • 参数确定:定义 dp[i][j]表示第 i 个元素,经过 j 次替换,得到当前元素值
      • 最终结果:dp[n][j] j <= Math.(m, n) 输出替换次数:j
    • 什么时候选择不替换
      • arr1[i] > dp[i-1][j]当前元素大于第i-1个元素经过j次替换之后的结果
        • 有:dp[i][j] = dp[i-1][j] if arr1[i] > dp[i-1][j]
    • 替换
      • 从数组arr2中找到元素arr2[k]使arr2[k] > dp[i-1][j-1]
        • dp[i-1][j-1]表示第i-1个元素经过j-1次替换之后的结果
        • 有:dp[i][j] = arr2[k]
  • 状态转移

![](null#card=math&code=\begin{cases}
dp[i][j] = min(dp[i][j],&arr_1[i]), & \text{if a r r 1 [ i ] > d p [ i − 1 ] [ j ] arr_1[i]>dp[i-1][j] arr1[i]>dp[i1][j]}\
dp[i][j] = min(dp[i][j],&arr_2[k]), & \text{if arr_2[k]>dp[i-1][j-1]}
\end{cases}&id=X5oVX)

  • 边界确定
    • 为了方便计算
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cALoixEN-1682003137881)(null#card=math&code=dp[i][j]&id=hcEOV)]初始值都设置为Integer.MAX_VALUE
      • 初始令dp[0][0] = -1表示最小值

代码

    public int authorityWayOne(int[] arr1, int[] arr2) {// 对 数组2 进行排序Arrays.sort(arr2);// 去重List<Integer> list = new ArrayList<>();int prev = -1;for(int num : arr2) {if(num != prev) {list.add(num);prev = num;}}int n = arr1.length;int m = list.size();int[][] dp = new int[n+1][Math.min(m, n) + 1];// 初始化填充数据,方便计算for(int i = 0;i <= n;i++) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[0][0] = -1;for(int i = 1;i <= n;i++) {for(int j = 0;j <= Math.min(m, n);j++) {if(arr1[i-1] > dp[i-1][j]) {// 这里不要搞混了dp[i][j] = arr1[i-1];}if(j > 0 && dp[i-1][j-1] != Integer.MAX_VALUE) {//  查找严格大于 dp[i-1][j-1] 的最小元素int idx = binary_search(list, j-1, dp[i-1][j-1]);if(idx != m) {dp[i][j] = Math.min(dp[i][j], list.get(idx));}}if(i == n && dp[i][j] != Integer.MAX_VALUE) {return j;}}}return -1;}private int binary_search(List<Integer> list, int low, int target) {int high = list.size();// 左闭右开区间while(low < high) {int mid = low + ((high - low) >> 1);if(list.get(mid) > target) {high = mid;} else {low = mid + 1;}}return low;}

优化一

  • 数组原地去重
    public int makeArrayIncreasing(int[] arr1, int[] arr2) {//  右边数组中选取元素,赋值给左边数组元素//  数组严格递增,所以数组中不能存在相同的元素//  对于 arr1 中的每一个元素都面临两种选择,换或者不换//  --那么最终可以得到最终结果//  --最小操作数一定存在这个过程中,现在问题是代码如何写//  首先 arr2 中的元素每一个只能用一次,为什么只能用一次?//  因为 要保证数组 arr1 严格递增//  所以可以对数组   arr2 进行排序Arrays.sort(arr2);//  那么现在问题是需要从 第一个元素开始判断换不换,//  定义 dp[i][j] 表示前 i 个元素进行 j 次替换之后末尾元素的最大值int n = arr1.length, m = 0;//  arr2 中的重复元素不需要使用,所以进行去重for(int i = 1;i < arr2.length;i++) {if(arr2[m] != arr2[i]) {arr2[++m] = arr2[i];}}// 拿到不重复数组的长度m++;//  拿到之后呢?//  最大的交换次数是多少?- 交换所有元素int changeNum = Math.min(m, n);//  那么接下来呢? 定义dp  一维:元素个数,二维:交换次数int[][] dp = new int[n+1][changeNum+1];//  初始化最大值for(int i = 0;i <= n;i++) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[0][0] = -1;for(int i = 1;i <= n;i++) {for(int j = 0;j <= Math.min(i, m);j++) {// 如果当前元素大于前一个元素if(arr1[i - 1] > dp[i-1][j]) {dp[i][j] = arr1[i - 1];}// 尝试交换.if(j > 0 && dp[i-1][j-1] != Integer.MAX_VALUE) {// 查找严格大于  dp[i-1][j-1] 的元素// 这里涉及到二分查找,如何才能找到 严格大于 dp[i-1][j-1] 的元素int idx = binary_search(arr2, j-1, dp[i-1][j-1], m);if(idx != m) {dp[i][j] = Math.min(dp[i][j], arr2[idx]);}}if(i == n && dp[i][j] != Integer.MAX_VALUE) {return j;}}}return -1;}private int binary_search(int[] arr, int j, int prev, int m) {// 左闭右开区间查找int left = j,right = m;while(left < right) {int mid = left + ((right - left) >> 1);if(arr[mid] > prev) {right = mid;} else {left = mid+1;}}return left;}

参考

官方题解
https://leetcode.cn/problems/make-array-strictly-increasing/solution/zui-chang-di-zeng-zi-xu-lie-de-bian-xing-jhgg/

相关文章:

1187.使数组严格递增 学习记录

题目描述 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 < i < arr1.l…...

权限控制_SpringSecurity

认证-授权 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作…...

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看

鉴于现在严峻的就业形势&#xff0c;千万大学生即将出新手村&#xff0c;今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题&#xff0c;与君共勉&#xff01; 一、开场白 Q&#xff1a;简单自我介绍一下吧 Q&#xff1a;项…...

今年SMETA审核费用即将涨价

【今年SMETA审核费用即将涨价】 SMETA全称&#xff08; Sedex Members Ethical Trade Audit &#xff09;&#xff0c;即Sedex会员社会道德贸易审核&#xff0c;它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台&#xff0c;SMETA是审核方法…...

基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

基于深度学习和生理信号的疾病筛查:个体内和个体间研究的价值与应用

一、引言 随着深度学习技术的飞速发展&#xff0c;基于生理信号的疾病筛查和诊断方法在医学领域得到了广泛应用。这些方法通常利用个体内和个体间的生理信号数据&#xff0c;通过训练深度学习模型实现疾病的自动识别和预测。本文将讨论个体内和个体间研究在这一领域的价值和应…...

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序

目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候&#xff0c;经常遇到这个题目&#xff0c;首先从题目上看&#xff0c;就知道考察的是多线程方面知识&#xff0c;我第一次看到这个题目的时候&#xff0c;就想到了使用CountDownLatch这个计数器来实现&#xff0c…...

83.qt qml-初步学习2D粒子影响器(二)

由于QmlBook in chinese翻译过来的文字有些比较生疏难于理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 QML粒子所有类型: Qt Quick Particles QML Types | Qt Quick 6.5.0 Affector类型: Attractor QML Type | Qt Quick 6.5.…...

4.17-4.18学习总结

MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5&#xff1f; 存储一些敏感信息的时候&#xff0c;如果不进行加密会出现安全问题。 例如&#xff1a;系统登录的密码&#xff0c;如果数据库中的密码采用明文&#xff0c;一旦数据库泄…...

Spring事务

事务作用&#xff1a; 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务&#xff0c;提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...

Linux新的设备或分区挂载到系统中mount使用方法

如果想将一个新的设备或分区挂载到系统中&#xff0c;可以按照以下步骤进行操作&#xff1a; 确定要挂载的设备或分区的设备名&#xff0c;例如 /dev/sdb1。 创建挂载点&#xff0c;可以在任何目录下创建一个新目录作为挂载点&#xff0c;例如 /mnt/mydevice。 sudo mkdir /mn…...

移动硬盘损坏如何恢复数据

移动硬盘一种小巧便携的存储介质&#xff0c;可用于各电脑之间交换大容量数据&#xff0c;可以随时插拔&#xff0c;进行高速传输数据。但有好也有坏&#xff0c;在我们使用中也会出现一些移动硬盘损坏故障&#xff0c;比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...

Material Design:为你的 Android 应用提供精美的 UI 体验

Material Design&#xff1a;为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念&#xff1a;介绍 Material Design 是 Google 推出的一种设计语言&#xff0c;用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则&#xff0c;包括材料…...

springboot+vue学生毕业离校系统(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…...

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

目录 一、ContentResolver基本用法 如何查询&#xff1f; 如何向表中添加一条数据&#xff1f; 如何更新这条新添加的数据&#xff1f; 如何删除这条数据&#xff1f; 二、读取系统联系人 要想你的APP访问其他应用程序的数据&#xff0c;需要使用内容提供器&#xff0c;下面使…...

【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…...

倍数+路径之谜

倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中&#xff0c;有多少个…...

【Unity渲染】URP透明物体自身渲染穿插异常问题

背景&#xff1a; 对于URP中的某个物体&#xff0c;我们如果希望他正反面都可以被渲染。 通常会有两种解决方案&#xff1a; 1.将网格设置为双面网格。&#xff08;此种情况Mesh.RecalculateNormals计算结果可能会异常&#xff0c;解决可参考网格法线生成异常解决&#xff0…...

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

c/c:指针&#xff0c;指针定义和使用&#xff0c;指针大小4字节&#xff0c;野指针&#xff0c;空指针*pNULL 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xf…...

CAS实现原⼦操作的三⼤问题,该如何解决?

目录 1、ABA问题 2.循环时间长开销大 3、只能保证一个共享变量的原子操作 总结&#xff1a; CAS&#xff08;Compare-and-Swap&#xff09;是一种用于实现原子操作的技术&#xff0c;但是它存在着三个主要的问题&#xff1a;ABA问题、循环时间长开销大、只能保证一个共享变…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...