【LeetCode: 1187. 使数组严格递增 | 暴力递归=>记忆化搜索=>动态规划 】

news2024/9/28 19:18:58

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚗 知识回顾
    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力递归
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚗 知识回顾

大家再看这道题目之前,可以先去看一下我之前写过的一篇关于最长递增子序列算法题的博客,再看这个题目就更容易理解了。
博客的地址放到这里了,可以先去学习一下这到题目。

  • 【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】
  • 【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】
  • 【LeetCode: 673. 最长递增子序列的个数 | 动态规划】

🚩 题目链接

  • 1187. 使数组严格递增

⛲ 题目描述

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

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

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

示例 1:

输入:arr1 = [1,5,3,6,7], arr2 = [1,3,2,4]
输出:1
解释:用 2 来替换 5,之后 arr1 = [1, 2, 3, 6, 7]。
示例 2:

输入:arr1 = [1,5,3,6,7], arr2 = [4,3,1]
输出:2
解释:用 3 来替换 5,然后用 4 来替换 3,得到 arr1 = [1, 3, 4, 6, 7]。
示例 3:

输入:arr1 = [1,5,3,6,7], arr2 = [1,6,3,3]
输出:-1
解释:无法使 arr1 严格递增。

提示:

1 <= arr1.length, arr2.length <= 2000
0 <= arr1[i], arr2[i] <= 10^9

🌟 求解思路&实现代码&运行结果


⚡ 暴力递归

🥦 求解思路

  1. 题目需要我们在arr2数组中寻找元素,使得arr1数组中的元素保持严格递增的最少次数,如果都不满足,直接返回false。
  2. 那么,该题怎么求解呢?大的问题规模我们已经分析完了,接下来我们看可不可以继续划分为更小的规模,如果前面从0到i的位置都是递增的,那问题是不是就变成从i+1到最后一个位置要保持严格递增的最小次数了呢?是的,所以我们可以通过递归来求解。
  3. 这个题目还需要我们在arr2中查找元素,我们可以使用二分进行查找,来提高我们的效率。
  4. 在arr2查找什么元素呢?因为在递归的时候,我们会维护一个之前选择的状态,每次递归的时候我们都会判断,如果当前元素值是小于我们之前位置元素的,此时我们需要进行二分查找,找到大于target最左侧的元素。
  5. 有了基本的思路,接下来就是具体的实现。

🥦 实现代码

注意:代码可以继续优化,下面的代码有一些冗余的地方还可以继续修正,这个就是一个粗略的版本。

class Solution {
    public int makeArrayIncreasing(int[] arr1, int[] arr2) {
        Arrays.sort(arr2);
        int ans=process(0,arr1,Integer.MIN_VALUE,arr2);
        return ans<Integer.MAX_VALUE/2?ans:-1;
    }

    public int process(int index,int[] arr1,int pre,int[] arr2){
        if(index>=arr1.length) return 0;
        int min=Integer.MAX_VALUE/2;
        // 必须替换
        if(arr1[index]<=pre){
            // 在arr2中找到最小的大于pre的那个数
            int moreIndex=binarySearch(arr2,pre);
            if(moreIndex<arr2.length){
                min=Math.min(min,process(index+1,arr1,arr2[moreIndex],arr2)+1);
            }
        }else{
            // 可以替换 可以不替换
            int p1=process(index+1,arr1,arr1[index],arr2);
            int moreIndex=binarySearch(arr2,pre);
            int p2=Integer.MAX_VALUE;
            if(moreIndex<arr2.length){
                p2=Math.min(min,process(index+1,arr1,arr2[moreIndex],arr2)+1);
            }
            min=Math.min(p1,p2);
        }
        return min;
    }

    public int binarySearch(int[] nums,int target){
        int left=-1,right=nums.length;
        while(left+1<right){
            int mid=(left+right)>>1;
            if(nums[mid]>target){
                right=mid;
            }else{
                left=mid;
            }
        }
        return right;
    }
}

🥦 运行结果

时间超限了,不要紧哦,我还有锦囊妙计!

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 根据我们递归的分析,在递归的过程中会产生重复的子过程,所以我们想到了加一个缓存表,也就是我们的记忆化搜索。
  2. 使用记忆化搜索的时候,我们可以使用Map来记录每次缓存的结果,使用Map来充当缓存的方式也有很多,比如说开辟一个Map类型的数组,数组中存储的Map<Integer,Integer>,这些方式都是可以实现的,感兴趣的同学都可以进行积极的尝试。

🥦 实现代码

class Solution {

    Map<String, Integer> map=new HashMap<>();

    public int makeArrayIncreasing(int[] arr1, int[] arr2) {
        Arrays.sort(arr2);
        int ans=process(0,arr1,Integer.MIN_VALUE,arr2);
        return ans<Integer.MAX_VALUE/2?ans:-1;
    }

    public int process(int index,int[] arr1,int pre,int[] arr2){
        if(index>=arr1.length) return 0;
        if(map.containsKey(index+"-"+pre)){
            return map.get(index+"-"+pre);
        }
        int min=Integer.MAX_VALUE/2;
        // 必须替换
        if(arr1[index]<=pre){
            // 在arr2中找到最小的大于pre的那个数
            int moreIndex=binarySearch(arr2,pre);
            if(moreIndex<arr2.length){
                min=Math.min(min,process(index+1,arr1,arr2[moreIndex],arr2)+1);
            }
        }else{
            // 可以替换 可以不替换
            int p1=process(index+1,arr1,arr1[index],arr2);
            int moreIndex=binarySearch(arr2,pre);
            int p2=Integer.MAX_VALUE;
            if(moreIndex<arr2.length){
                p2=Math.min(min,process(index+1,arr1,arr2[moreIndex],arr2)+1);
            }
            min=Math.min(p1,p2);
        }
        map.put(index+"-"+pre,min);
        return min;
    }

    public int binarySearch(int[] nums,int target){
        int left=-1,right=nums.length;
        while(left+1<right){
            int mid=(left+right)>>1;
            if(nums[mid]>target){
                right=mid;
            }else{
                left=mid;
            }
        }
        return right;
    }
}

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

STL——list、stack与queue

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

Springboot 整合 Mybatis

创建SpringBoot项目 首先在IDEA中创建一个SpringBoot项目&#xff0c;注意Java Version 然后Packaging为Jar包形式&#xff0c;Type改为Maven形式。 在上图的下一步中可以选择相关依赖&#xff0c;也可以在项目里面的pom文件中自己添加相关依赖&#xff0c;然后进行import也可…

在外包搞了7年,废了.....

我以自身的经验告诫大家&#xff0c;不要去外包&#xff0c;原因&#xff1a; 无法深入理解项目&#xff1a;由于外包公司通常只负责项目的某一个部分或某一个阶段&#xff0c;软件测试人员无法对整个项目进行深入了解&#xff0c;可能会影响到测试的全面性和准确性。 对测试要…

RB-PEG-NHS;NHS-PEG-Rhodamine罗丹明聚乙二醇琥珀酰亚胺 红色荧光染料罗丹明B功能化聚乙二醇

RB-PEG-NHS,罗丹明-聚乙二醇-活性脂 中文名称&#xff1a;罗丹明-聚乙二醇-活性脂 英文名称&#xff1a;RB-PEG-NHS 性状&#xff1a;固体或者粘稠液体&#xff0c;取决于分子量大小。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;溶于水。 分子量&#xff1a;400、60…

【深度学习】RNN、LSTM、GRU

【深度学习】RNN、LSTM、GRU RNNLSTMGRU结语 RNN 和普通神经网络一样&#xff0c;RNN有输入层、输出层和隐含层&#xff0c;不一样的是RNN在不同的时间 t t t会有不同的状态&#xff0c;其中 t − 1 t-1 t−1时刻隐含层的输出会作用到 t t t时刻的隐含层。 RNN因为加入了时间…

强大的图像查看器:EdgeView mac中文

EdgeView mac中文版是mac上一款强大的图像查看软件&#xff0c;可以处理一些最流行的图像文件格式&#xff0c;同时还提供对导航杂志或漫画书的支持。EdgeView能够打开著名的图像文件格式主要包括JPG&#xff0c;GIF&#xff0c;PSD在内的多种格式文件&#xff0c;支持Retina显…

深度解析JavaScript自动化测试工具Cypress的工作运行原理

目录 引言 什么是Cypress&#xff1f; Cypress的工作原理 Cypress运行原理 Cypress和其他自动化测试工具有什么不一样&#xff1f; Cypress的缺点 【自动化测试工程师学习路线】 引言 在当今的软件开发中&#xff0c;自动化测试工具已成为不可或缺的一部分&#xff0c;…

负载均衡式在线OJ

目录 项目介绍所用技术与开发环境所用技术开发环境 项目各种安装升级 gcc安装 jsoncpp安装 cpp-httplib安装boost库安装与测试 ctemplate 项目宏观结构总体文件目录comm : 公共模块compile_run_server&#xff1a;编译和运行compiler.hpp编译runner.hpp 运行compiler_runner.hp…

ChatGPT 速通手册——开源社区的进展

开源社区的进展 在 ChatGPT 以外&#xff0c;谷歌、脸书等互联网巨头&#xff0c;也都发布过千亿级参数的大语言模型&#xff0c;但在交谈问答方面表现相对 ChatGPT 来说都显得一般。根据科学人员推测&#xff0c;很重要的一部分原因是缺失了RLHF(Reinforcement Learning with…

Banana Pi CM4 计算机模组评测(VS 树莓派计算模块 CM4)

如果您正在寻找一款可靠的单板计算机来提升您的下一个项目&#xff0c;但找不到满足您需求的 Raspberry Pi&#xff0c;让我们看看我是否可以提供帮助。在这篇详细的评论中&#xff0c;我将向您介绍 Banana Pi CM4&#xff0c;这是一款适用于各种任务的多功能且功能强大的解决方…

【OpenCV 例程 300篇】257.OpenCV 生成随机矩阵

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】257. OpenCV 生成随机矩阵 3.2 OpenCV 创建随机图像 OpenCV 中提供了 cv.randn 和 cv.randu 函数生成随机数矩阵&#xff0c;也可以用于创建随机图像。 函数 cv.randn 生成的矩阵服从正态分布&…

【caddy】 caddy反向代理api服务 聚合go-zero微服务 放过nginx让caddy来快速实现吧

帮助go-zero开发者聚合api 相关视频一、go-zero 微服务整体架构1、微服务的基本架构2、go-zero 微服务的 apiauthrpc.api 文件routes.go 文件 二、本地开发的痛点1、本地多个端口开启的服务2、apifox、postman 三、caddy1、mac下caddy安装2、配置我们自己的caddyfile1&#xff…

SpringBootWeb入门-HTTP协议

一、SpringBootWeb-快速入门 建好springboot工程之后&#xff0c;只留下这几个文件。 这个是springboot的父工程&#xff0c;其实就是继承 二、HTTP协议-概述 •HTTP-概述 三、HTPP协议-请求协议 四、HTTP协议-响应协议 一、状态码大类 状态码分类说明1xx响应中——临时状态码…

buuctf -2

目录 你竟然赶我走 大白 N种方法解决 [ACTF2020 新生赛]Include 1 php://filter的一些学习 [ACTF2020 新生赛]Exec [强网杯 2019]随便注 你竟然赶我走 1.下载文件&#xff0c;得到一张图片 2.放进010分析&#xff0c;在文件尾得到flag 大白 1.根据题目提示&#xff0…

Python安装模块总失败?一次教你学会镜像安装

人生苦短&#xff0c;我用python 安装模块总是不成功&#xff1f; 这次一次性讲清楚~ 还是安装报错指路:点击此处跳转文末名片获取 为什么会出现安装模块失败? 首先我们要知道 其实大部分我们在用的模块, 都是歪果仁开发的, 然而我们在输入 “pip install 模块名” 的时候,…

「 JVM 」常见的垃圾收集器Garbage collector(GC)

「 JVM 」常见的垃圾收集器Garbage collector&#xff08;GC&#xff09; 参考&鸣谢 【JVM系统学习之路】常见垃圾回收器 山间木匠 Java 的七种垃圾收集器 | Linux 中国 Jayashree Huttanagoudar 带你走近Java虚拟机到底有哪些经典的垃圾收集器 码上遇见你 文章目录 「 JV…

2023.04.17 运行开源代码tinyriscv步骤及遇到问题

tinyriscv&#xff1a;https://gitee.com/liangkangnan/tinyriscv/tree/verilator 如有错误之处还请不吝赐教&#xff01; 1、安装gcc工具链 下载gcc工具链(百度云链接&#xff0c;提取码&#xff1a;yaib)&#xff0c;使用下面的命令解压到/opt/riscv32目录下&#xff1a; …

Spring定时任务常用Cron表达式

目录 一、SpringBoot定时任务 定时任务概述 创建定时任务 代码开启定时任务 执行结果 &#xff08;单线程&#xff09; 多线程处理定时任务 执行结果&#xff08;并发&#xff09; 二、Cron详解 Cron表达式是什么 Cron表达式的结构 每个域可出现的字符类型和各字符的…

花生采摘

[NOIP2004 普及组] 花生采摘 题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都…

linux 安装神州通用数据库 V7.0

linux 安装神州通用数据库 V7.0 操作系统、数据库1、官方下载链接2、windows客户端下载链接3、官方安装手册4、安装前准备3.1、创建安装用户3.2、以root 用户修改神通数据库安装包的所有者为shentong 用户3.3、以root 用户创建神通数据库主目录并修改所有者为shentong 用户3.4、…