【每日一题Day184】LC1187使数组严格递增 | dp

news2024/9/21 11:07:01

使数组严格递增【LC1187】

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

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

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

很难呀 需要消化(为什么有时候感觉自己很聪明 有时候感觉很笨笨)

  • 思路

    • 首先很容易想到的是,将arr2排序,如果 a r r 1 [ i ] < = a r r 1 [ i − 1 ] arr1[i]<=arr1[i - 1] arr1[i]<=arr1[i1],为了满足递增我们应该将 a r r 1 [ i − 1 ] arr1[i-1] arr1[i1]替换为arr2中小于 a r r 1 [ i ] arr1[i] arr1[i]的最大值【二分查找】(我就想到这里,没有想到还要用dp)

    • 然后,使数组arr1 i i i个元素严格递增需要的最小「操作」数可以由之前的状态转移得到【替换或者不替换,替换的值取决于下一个元素的大小(本题限制因素)】,因此可以定义状态 d p [ i ] dp[i] dp[i]为将arr1[0:i]转化为严格递增数组,并且 a r r [ i ] arr[i] arr[i]不做替换的最小操作数

      • 确定 base case,初始状态的值: d p [ 0 ] = 0 , d p [ i ] = ∞ dp[0]=0,dp[i]= \infty dp[0]=0dp[i]=

      • 确定「状态」,也就是原问题和子问题中会变化的变量

        本题中状态为数组最后一个值,影响是否需要改变的次数

      • 确定「选择」,也就是导致「状态」产生变化的行为

        如果 a r r 1 [ i ] > = a r r 1 [ i − 1 ] arr1[i]>=arr1[i - 1] arr1[i]>=arr1[i1],那么不需要替换, d p [ i ] = d p [ i − 1 ] dp[i]=dp[i-1] dp[i]=dp[i1]

        如果 a r r 1 [ i ] < a r r 1 [ i − 1 ] arr1[i]<arr1[i - 1] arr1[i]<arr1[i1],那么我们需要将 a r r 1 [ i − 1 ] arr1[i-1] arr1[i1]替换为为arr2中小于 a r r 1 [ i ] arr1[i] arr1[i]的最大值 a r r 2 [ j ] arr2[j] arr2[j],然后在 k ∈ [ 1 , m i n ( i − 1 , j ) ] k \in [1,min(i-1,j)] k[1,min(i1,j)]的范围内枚举需要替换的个数,如果满足 a r r [ i − k − 1 ] < a r r [ j − k ] arr[i-k-1] < arr[j-k] arr[ik1]<arr[jk],那么将区间 a r r 1 [ i − k + 1 , i − 1 ] arr1[i-k+1,i-1] arr1[ik+1,i1]替换为 a r r 2 [ j − k , j ] arr2[j-k,j] arr2[jk,j] d p [ i ] dp[i] dp[i]可以从 d p [ i − k − 1 ] dp[i-k-1] dp[ik1]转移而来。

        因此状态转移方程为
        d p [ i + 1 ] = m i n k = 1 m i n ( i − 1 , j ) ( d p [ i − k − 1 ] + k ) dp[i+1]=min_{k=1}^{min(i-1,j)}(dp[i-k-1]+k) dp[i+1]=mink=1min(i1,j)(dp[ik1]+k)

  • 实现

    class Solution {
        public int makeArrayIncreasing(int[] arr1, int[] arr2) {
            Arrays.sort(arr2);
            int m = 0;
            for (int x : arr2) {
                if (m == 0 || x != arr2[m - 1]) {
                    arr2[m++] = x;
                }
            }
            final int inf = 1 << 30;
            int[] arr = new int[arr1.length + 2];
            arr[0] = -inf;
            arr[arr.length - 1] = inf;
            System.arraycopy(arr1, 0, arr, 1, arr1.length);
            int[] f = new int[arr.length];
            Arrays.fill(f, inf);
            f[0] = 0;
            for (int i = 1; i < arr.length; ++i) {
                if (arr[i - 1] < arr[i]) {
                    f[i] = f[i - 1];
                }
                int j = search(arr2, arr[i], m);
                for (int k = 1; k <= Math.min(i - 1, j); ++k) {
                    if (arr[i - k - 1] < arr2[j - k]) {
                        f[i] = Math.min(f[i], f[i - k - 1] + k);
                    }
                }
            }
            return f[arr.length - 1] >= inf ? -1 : f[arr.length - 1];
        }
    
        private int search(int[] nums, int x, int n) {
            int l = 0, r = n;
            while (l < r) {
                int mid = (l + r) >> 1;
                if (nums[mid] >= x) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            return l;
        }
    }
    
    作者:ylb
    链接:https://leetcode.cn/problems/make-array-strictly-increasing/solutions/2236262/python3javacgotypescript-yi-ti-yi-jie-do-j5ef/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度

      • 时间复杂度: O ( n ( l o g m + m i n ( n , m ) ) ) O(n(logm+min(n,m))) O(n(logm+min(n,m))),arr1和arr2数组长度分别为n和m
      • 空间复杂度: O ( n ) O(n) O(n)
  • 变形题:respect灵神

    image-20230420160902723

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

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

相关文章

前端学习:HTML块、类、Id

目录 快 一、块元素、内联元素 二、HTML 元素 三、HTML元素 类 一、分类块级元素 二、分类行内元素 Id 一、使用 id 属性 二、 class与ID的差异 三、总结 快 一、块元素、内联元素 大多数HTML元素被定义为块级元素或内联元素。 块级元素在浏览器显示时&#xff0c;通常会…

Docker常用命令详解,有这些足够了

首先启动类 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机自启动&#xff1a;systemctl enable docker 查看docker概要…

【CocosCreator入门】CocosCreator组件 | Widget(对齐)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的Widget组件用于UI布局和调整&#xff0c;可以通过调整Widget组件来实现UI元素的自适应和排版。 目录 一、组件介绍 二、组件属性 三、组件使用 四、脚本示例 一、组件介绍 在Coc…

Python中的统计学(二)

大数定律和中心极限定律都是概率论中重要的定理。它们之间的不同在于它们所涉及的随机变量和极限的不同。 大数定律是指随着样本容量的增大&#xff0c;样本均值越来越接近于总体均值的定律。即样本均值的极限等于总体均值&#xff0c;也就是说&#xff0c;当样本量足够大时&a…

绝了!!PDF转换没想到这么简单

PDF处理是很多小伙伴的“痛”&#xff0c;在工作学习中&#xff0c;PDF转换、PDF编辑、PDF和图片的各种问题都是需要快速解决的&#xff0c;但市面上不少付费的软件让我们很是肉痛&#xff01; 今天给大家推荐5个免费的神仙PDF转换网站&#xff0c;解决你的所以PDF问题~ 记得…

Simulink 自动代码生成电机控制:硬件开发板系统介绍

目录 前言 电源电路 MCU电路 开发板接口 关于电流采样和过流保护 驱动部分 总结 前言 在介绍开发板之前突然有感而发想多说两句&#xff0c;本人从事电控行业也是有一些年头了&#xff0c;除了刚刚毕业就接触的电机控制外&#xff0c;就是电源控制相关的&#xff0c;像三相P…

Point-to Analysis指针分析(2)

https://blog.csdn.net/qq_43391414/article/details/111046505 下面介绍一种新的指针分析的算法Steensgaard算法&#xff0c;并将其与上一篇文章介绍 Steensgaard算法 不同于Andersen算法,Steensgaard在前者的基础上&#xff0c;再次对问题进行了简化&#xff0c;从而指针分析…

远程访问及控制

目录 一、SSH远程管理 1&#xff09;SSH的简介 2&#xff09;SSH的优点 3&#xff09;常用的SSH软件的介绍 4&#xff09;SSH 的组成 5&#xff09;SSH的密钥登录 密钥登录的过程&#xff1a; 二、SSH的运用 1 &#xff09;SSH配置文件信息 2&#xff09;存放ssh服务…

JAVA 进程CPU过高排查

1. top命令看一下JAVA进程&#xff1a; 占用500%多&#xff0c;非常恐怖&#xff0c;程序卡得动不了了。 2. 使用命令top -H -p PID 此处PID就是上一步获取的进程PID&#xff0c;我的PID是13342&#xff0c;通过此命令可以查看实际占用CPU最高的的线程的ID&#xff0c;此处几位…

ChatGPT+Ai绘图【stable-diffusion实战】

ai绘图 stable-diffusion生成【还有很大的提升空间】 提示词1 Picture a planet where every living thing is made of light. The landscapes are breathtakingly beautiful, with mountains and waterfalls made of swirling patterns of color. What kind of societies m…

【学习笔记】unity脚本学习(五)【常用的方法函数Destroy、Instantiate 、SendMessage、invoke 、Coroutine】

目录 常用的方法函数Object体系结构MonoBehaviour复习继承的变量 继承自Object的方法Destroy 物体的销毁DestroyImmediate 立即销毁对象&#xff08;强烈建议您改用 Destroy&#xff09;Object.DontDestroyOnLoadObject.Instantiate 物体的生成类子弹生成案例 继承自Component的…

八股+面经

文章目录 项目介绍1.不动产项目数据机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 2.图书项目技术栈面试问题 Java基础MapHashMap v.s Hashtable(5点)ConcurrentHashMap v.s Hashtable(2点)代理模式1. 静态代理2. 动态代理2.1 JDK 动…

什么样的人适合学习网络安全?怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a;什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 会产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级学科&#xff0c;…

elasticsearch——数据同步

目录 数据同步思路分析 方案一&#xff1a;同步调用 方案二&#xff1a;异步通知 方案三&#xff1a;监听binlog 区别 关于elasticsearch与数据库数据同步 导入课前资料提供的hotel-admin项目&#xff0c;启动并测试酒店数据的CRUD 声明exchange、queue、RoutingKey 导…

Python列表和字典前面为什么会加星号(**)?

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 中&#xff0c;单星号*和双星号**除了作为“乘”和“幂”的数值运算符外&#xff0c; 还在列表、元组、字典的操作中有着重要作用。 一、列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09…

flac格式如何转换为mp3,这3个方法超好用

随着音频格式的不断创新和发展&#xff0c;每种格式对应不同的特点。比如像flac格式可以提供无损音质的体验&#xff0c;但它的文件大小却是相对较大&#xff0c;不太适合在普通设备上进行传输和使用。而mp3作为一种流行的音频格式&#xff0c;它的压缩率较高&#xff0c;不但可…

OceanBase 4.1解读:我们想给用户一个开箱即用的OceanBase部署运维工具

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 关于作者 肖磊 OceanBase 产品专家 负责 OceanBase 运维管控体系产品规划与设计&#xff0c;包括安装部署工具(OBD、OAT)、运维管控平台&#xff08;OCP、OCP Express&#xff09;&#xff0c;致力…

MySQL安装步骤详解

MySQL环境搭建 MySQL的下载 MySQL的4大版本 MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;自由下载&#xff0c;但不提供官方技术支持&#xff0c;适用于 大多数普通用户。 MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;不能在线下载…

运行torch心得体会

遇到的问题&#xff1a; ①ModuleNotFoundError: No module named torch ②‘conda‘不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 ③import torch 提示找不到指定的模块visual C redistributable is not installed 过程&#xff1a; 用前一段时间就下…

流程图拖拽视觉编程--概述

一般的机器视觉平台采用纯代码的编程方式&#xff0c;如opencv、halcon&#xff0c;使用门槛高、难度大、定制性强、开发周期长&#xff0c;因此迫切需要一个低代码开发的视觉应用平台。AOI缺陷检测的对象往往缺陷种类多&#xff0c;将常用的图像处理算子封装成图形节点,如抓直…