使用递归时的几种优秀处理手法(持续更新中,欢迎评论补充)

一、记忆缓存

遇到出现同样的参数多次递归调用时,可以添加记忆缓存,以空间换时间。

原理说明:

1、如下面案例中的递归,调用时每次都从n执行到0(n一次衰减),则可能存在n-1的阶乘次重复参数调用,这里将重复部分都缓存起来,达到了跟动态规划类似的效果。

下面的力扣案例,没加缓存记忆会执行超时,增加后顺利通过。

#案例

3193. 统计逆序对的数目

给你一个整数 n 和一个二维数组 requirements ,其中 requirements[i] = [endi, cnti] 表示这个要求中的末尾下标和 逆序对 的数目。

整数数组 nums 中一个下标对 (i, j) 如果满足以下条件,那么它们被称为一个 逆序对 :

  • i < j 且 nums[i] > nums[j]

请你返回 [0, 1, 2, ..., n - 1] 的 

排列

 perm 的数目,满足对 所有 的 requirements[i] 都有 perm[0..endi] 恰好有 cnti 个逆序对。

由于答案可能会很大,将它对 109 + 7 取余 后返回。

示例 1:

输入:n = 3, requirements = [[2,2],[0,0]]

输出:2

解释:

两个排列为:

  • [2, 0, 1]
    • 前缀 [2, 0, 1] 的逆序对为 (0, 1) 和 (0, 2) 。
    • 前缀 [2] 的逆序对数目为 0 个。
  • [1, 2, 0]
    • 前缀 [1, 2, 0] 的逆序对为 (0, 2) 和 (1, 2) 。
    • 前缀 [1] 的逆序对数目为 0 个。

示例 2:

输入:n = 3, requirements = [[2,2],[1,1],[0,0]]

输出:1

解释:

唯一满足要求的排列是 [2, 0, 1] :

  • 前缀 [2, 0, 1] 的逆序对为 (0, 1) 和 (0, 2) 。
  • 前缀 [2, 0] 的逆序对为 (0, 1) 。
  • 前缀 [2] 的逆序对数目为 0 。

示例 3:

输入:n = 2, requirements = [[0,0],[1,0]]

输出:1

解释:

唯一满足要求的排列为 [0, 1] :

  • 前缀 [0] 的逆序对数目为 0 。
  • 前缀 [0, 1] 的逆序对为 (0, 1) 。

提示:

  • 2 <= n <= 300
  • 1 <= requirements.length <= n
  • requirements[i] = [endi, cnti]
  • 0 <= endi <= n - 1
  • 0 <= cnti <= 400
  • 输入保证至少有一个 i 满足 endi == n - 1 。
  • 输入保证所有的 endi 互不相同。

二、状态记录

部分算法题目中,在从顶层到最底层的一次递归中时,数组中前面层使用过的元素不允许再使用。该场景下即可使用数据状态记录的方法。

使用一个相同大小的状态数组boolean[n],数组初始化为false,对于目标数组使用过的元素,对应状态数组下同下标visit[i]赋值true,递归完,再将其赋值回false。

#案例

HJ67 24点游戏算法

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算

此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述:

读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

输出描述:

对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false

示例1

输入:

7 2 1 10

复制输出:

true
import java.io.*;/*知识点:递归、深度优先搜索、回溯算法
*/
public class Main {static int count =0;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str;while ((str = br.readLine()) != null) {String[] numstr = str.split(" ");int[] nums = new int[4]; // 存放数字int[] visit = newint[4]; // 存放对应位置数字的使用状态(1代表已使用)boolean flag = false;for (int i = 0; i < 4; i++) {nums[i] = Integer.parseInt(numstr[i]); // 读取数字}for (int i = 0; i < 4; i++) {visit[i] = 1; // 把当前数字标记为已使用if (dfs(nums, visit, nums[i])) { // 进入递归flag = true;break;}}System.out.println(flag);}}public static boolean dfs(int[] nums, int[] visit, int temp) {count++;for (int i = 0; i < nums.length; i++) {if (visit[i] == 0) { // 如果是未使用的数字visit[i] = 1; // 标记为已使用if (dfs(nums, visit, temp + nums[i]) // 递归判断|| dfs(nums, visit, temp - nums[i])|| dfs(nums, visit, temp * nums[i])|| dfs(nums, visit, temp / nums[i])) {// 如果存在满足条件的,终止循环return true;}// 不存在满足条件的,说明当前的数字顺序不符要求,进行回溯,把标记重置为0visit[i] = 0;}}// 数字都已使用且结果为24,返回真if (temp == 24) {return true;}// 不存在24,返回假return false;}
}

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

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

相关文章

ChatGPT智能对话绘画系统 带完整的安装源代码包以及搭建教程

系统概述 ChatGPT 智能对话绘画系统是一款集智能语言处理和绘画创作于一体的综合性系统。它利用了深度学习和自然语言处理技术&#xff0c;能够理解用户的意图和需求&#xff0c;并通过与用户的交互&#xff0c;生成富有创意的绘画作品。该系统的核心是一个强大的人工智能模型…

【RAG】PDF Chatbot 个人练手项目

【RAG】PDF Chatbot 个人练手项目 项目的架构和技术选择&#xff0c;以及如何利用它来提升个人的开发能力和理解人工智能技术在文档处理中的应用。 项目截图 后端&#xff1a;FastAPI 应用 功能特性&#xff1a; PDF 文件上传&#xff1a;通过界面或 API&#xff0c;上传 P…

基于weixin小程序新生报到系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;班级信息管理&#xff0c;师资力量管理&#xff0c;宿舍信息管理&#xff0c;宿舍安排管理&#xff0c;签到信息管理&#xff0c;论坛管理 小程序功能包括&#xff1a;系统首页&am…

Android跨进程调用,Binder线程池溢出导致ANR

Android跨进程调用&#xff0c;Binder线程池溢出导致ANR 如果发生ANR&#xff0c;找到trace.txt 、/data/anr目录下&#xff0c; "main" prio5 tid1 Native| group"main" sCount1 dsCount0 flags1 obj0x72c33e38 self0x78a64c2a00| sysTid1863 nice0 cgr…

Python学习笔记21:进阶篇(十)常见标准库使用之math模块,random模块和statistics模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 数学 P…

音频文件:16k16bit.mp3,16k16bit.wav,16k16bit.pcm,8k16bit.pcm有什么区别

这些文件是不同的音频格式和配置&#xff0c;它们的属性和使用方式有所不同。以下是每种格式的详细说明及其差异&#xff1a; 1. MP3 (16k16bit.mp3) 格式&#xff1a;MPEG-1 Audio Layer III (MP3)比特率&#xff1a;通常是可变的&#xff0c;但常见的是128 kbps到320 kbps&…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS semaphore作为锁

CMSIS 2.0 接口中的 Semaphore&#xff08;信号量&#xff09;是用于嵌入式系统中多线程或中断服务例程&#xff08;ISR&#xff09;之间同步和共享资源保护的重要机制。Semaphore 是一种用于控制对多个共享资源访问的同步机制。它可以被看作是一个计数器&#xff0c;用于跟踪可…

【Qt6.3 基础教程 20】使用Qt Designer提升界面设计效率与质量

文章目录 前言什么是Qt Designer&#xff1f;为什么使用Qt Designer&#xff1f;Qt Designer的核心功能如何使用Qt Designer&#xff1f;整合.ui文件到项目中总结 前言 界面设计是软件开发中至关重要的一部分&#xff0c;它直接关系到用户的第一印象和使用体验。对于使用Qt框架…

计算机组成原理,网络安全,软件工程等上机报告

这些都是学长们当年的战斗&#xff0c;如果需要的话后台联系我

【从0实现React18】 (六) 完成commit提交流程并初步实现react-dom包,完成首屏渲染测试

前面&#xff0c;我们提到 React 更新流程有四个阶段&#xff1a; 触发更新&#xff08;Update Trigger&#xff09;调度阶段&#xff08;Schedule Phase&#xff09;协调阶段&#xff08;Reconciliation Phase&#xff09;提交阶段&#xff08;Commit Phase&#xff09; 之前…

并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向 主要方向在于优化算法和将硬件的性能发挥到极致想要发挥出更多的硬件性能&#xff0c;最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率操作系统已经解决了磁盘和网卡的利用率问题&#xff0c;利用中断机制还能避免 CPU 轮询 I/O 状态&#xff0c;也提…

【机器学习】在【R语言】中的应用:结合【PostgreSQL数据库】的【金融行业信用评分模型】构建

目录 1.数据库和数据集的选择 1.准备工作 2.PostgreSQL安装与配置 3.R和RStudio安装与配置 2.数据导入和预处理 1.连接数据库并导入数据 1.连接数据库 2.数据检查和清洗 1.数据标准化 2.拆分训练集和测试集 3.特征工程 1.生成新特征 2.特征选择 4.模型训练和评估…

使用Tailwindcss之后,vxe-table表头排序箭头高亮消失的问题解决

环境 vue2.7.8 vxe-table3.5.9 tailwindcss/postcss7-compat2.2.17 postcss7.0.39 autoprefixer9.8.8 问题 vxe-table 表格表头 th 的排序箭头在开启正序或逆序排序时&#xff0c;会显示蓝色高亮来提示用户表格数据处在排序情况下。在项目开启运行了tailwindcss之后&#xff0…

数据集的未来:如何利用亮数据浏览器提升数据采集效率

目录 一、跨境电商的瓶颈1、技术门槛2、语言与文化差异3、网络稳定性4、验证码处理和自动识别5、数据安全6、法规和合规 二、跨境电商现在是一个合适的商机吗&#xff1f;三、数据集与亮数据浏览器1、市场分析2、价格监控3、产品开发4、供应链优化5、客户分析 四、亮数据浏览器…

上海计算机学会2020年3月月赛C++丙组T4连乘问题

题目描述 给定 a1​,a2​,⋯,an​&#xff0c;请计算一组乘积&#xff0c;记为P1​,P2​,⋯,Pn​&#xff0c;其中 Pi​ 的定义如下&#xff1a; 也就是说&#xff0c;Pi​ 是 a1​ 到 an​ 的连乘再除去 ai​。由于答案可能比较大&#xff0c;输出每个 Pi​ 模 10000 的余数。…

==和equals区别

在编程中&#xff0c; 和 equals 都用于比较&#xff0c;但它们有不同的使用场景和意义。 在Java中&#xff1a; 运算符&#xff1a; 用于比较两个对象的引用是否相等。 比较的是两个对象在内存中的地址。 例如&#xff1a; String a new String("hello"); Stri…

算法05 模拟算法之二维数组相关内容详解【C++实现】

大家好&#xff0c;我是bigbigli&#xff0c;前面一节我们一节讲过一维数组的模拟了&#xff0c;如果还没看的话&#xff0c;可以&#x1f449;点击此处。模拟算法还有很多内容需要讲&#xff0c;比如图像、日期相关的模拟算法&#xff0c;后续将继续更新&#xff0c;今天先来讲…

代码随想录——跳跃游戏Ⅱ(Leetcode 45)

题目链接 贪心 class Solution {public int jump(int[] nums) {if(nums.length 1){return 0;}int count 0;// 当前覆盖最远距离下标int curDistance 0;// 下一步覆盖距离最远下标int nextDistance 0;for(int i 0; i < nums.length; i){nextDistance Math.max(nums[…

前端面试题(九)答案版

姓名&#xff1a; 面试时间&#xff1a; 面试岗位&#xff1a; 1、SEO优化&#xff1f; SEO(Search Engine Optimization)即搜索引擎优化,是一种提高网站在搜索引擎中排名的技术。主要包括: - 网站内容优化:提高网页内容质量,关键词优化等 -…

快速修复mfc100u.dll丢失解决方案

相连文章&#xff1a;SecureCRT的安装破解 [详细过程2024] 有小伙伴向我反馈在打开SecureFX注册机之后显示【mfc100u.dll找不到】重装之后也没有用&#xff0c;这个是因为Microsoft Visual C的运行时组件和库出现了错误&#xff0c;直接选择重新安装就可以 出现这种情况的原因…