【算法学习之路】6.递归与分治

news/2025/3/6 0:05:24/

递归分治

  • 前言
  • 一.简介
  • 二.解决办法
  • 三.总结

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

一.简介

1.递归

在数学和计算科学中是指在函数的定义中使用函数自身的方法,在将数据科学中还额外指一种通过将重复问题分解为子问题,而解决问题方法

2.分治

把一个复杂问题分成两个或者多个子问题,子问题相互独立,直到最后子问题可以简单求解 (其中的子问题可以用递归

二.解决办法

1.递归

1.1步骤:

1.找到递归出口(一般是最后一步)
2.找到递归条件:试着用小数据推一下,在站在第i个问题的角度去考虑

注:在递归过程中,将该函数认为是已完成函数

1.2例题

力扣面试题 08.06. 汉诺塔问题
在这里插入图片描述

class Solution {
public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {int n = A.size();move(n, A, B, C);}void move(int n, vector<int>& A, vector<int>& B, vector<int>& C){if(n == 1){C.push_back(A.back());A.pop_back();return;}move(n - 1, A, C, B);C.push_back(A.back());A.pop_back();move(n - 1, B, A, C);}
};

2.分治

2.1例题

力扣53. 最大子数组和
在这里插入图片描述

class Solution {
public:int maxMid(vector<int>& nums, int l, int r, int m) {//寻找中间最大值函数int lsum = INT_MIN;//左边最大值int rsum = INT_MIN;//右边最大值int sum = 0;//当前值for (int i = m; i >= l; i--) {//找左边sum += nums[i];lsum = max(sum, lsum);}sum = 0;for (int i = m + 1; i <= r; i++) {//找右边sum += nums[i];rsum = max(sum, rsum);}return lsum + rsum;//返回中间最大值}int maxSub(vector<int>& nums, int l, int r) {//寻找最大值if (l == r) {//结束条件return nums[l];}int mid = l + (r - l) / 2;//中间值int lsum = maxSub(nums, l, mid);//左int rsum = maxSub(nums, mid + 1, r);//右int msum = maxMid(nums, l, r, mid);//中间return max({ lsum, rsum, msum });//最大值}int maxSubArray(vector<int>& nums) {int n = nums.size();return maxSub(nums, 0, n - 1);}
};

2.2解释

取中心点M=(l + r) / 2。和的最大区间要么在中心点的左边,要么在中心点的右边,要么横跨中心点,所以问题分解为求这三个部分的最大区间和,然后再求这三个哪个最大—分成3个独立的小问题,分治
1.左边:递归
2.右边:递归
3.中间:贪心:lmax + rmax

三.总结

递归是一种编程技巧,一种解决问题的思维方式;
分治算法很大程度上是基于递归的,解决更具体问题的算法思想;


http://www.ppmy.cn/news/1576929.html

相关文章

前后端对接

前端与后端的对接主要通过 接口 进行数据交互&#xff0c;具体流程和方式如下&#xff1a; 1. 明确需求与接口定义 前后端协商&#xff1a;确定需要哪些接口、接口的功能、请求参数和返回格式。接口文档&#xff1a;使用工具&#xff08;如 Swagger、Postman、Apifox&#xff…

Pytorch构建LeNet进行MNIST识别 #自用

LeNet是一种经典的卷积神经网络&#xff08;CNN&#xff09;结构&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;主要用于手写数字识别&#xff08;如MNIST数据集&#xff09;。作为最早的实用化卷积神经网络&#xff0c;LeNet为现代深度学习模型奠定了基础&#xff0c;…

基于web端的ftp程序

搭建一个web页面访问的FTP服务器 github官网地址 vsftpd 程序搭建跳转地址 vsftpd 搭建完成之后&#xff0c;开始搭建 ftp-web 下载运行该项目需要 Node.js v4 才能运行。# node 版本为 v16.20.2 node -v v16.20.2git clone https://github.com/liuqi6908/ftp-web-client.gi…

ARM Coretex-M0核心压栈流程

STM32F013 单片机属于 ARM Cortex-M0 内核架构&#xff0c;其压栈行为主要发生在 异常处理&#xff08;如中断、异常进入&#xff09;或者手动使用栈&#xff08;如函数调用时的局部变量、寄存器保存&#xff09;时。以下是两种情况的详细分析&#xff1a; 1. 异常或中断触发时…

3dsmax中使用python创建PBR材质并挂接贴图

前言 笔者处理模型时下载到一个pbr材质库贴图包&#xff0c;手动每次创建材质过于麻烦&#xff0c;因此计划使用自动化脚本根据贴图名自动创建材质。 3dsmax的原本脚本使用的是maxscript&#xff0c;语法有点奇怪懒得学&#xff0c;发现也支持使用python编写脚本&#…

基于深度学习的静态图像穿搭美学评估与优化建议系统的基本实现思路及示例代码

以下是一个基于深度学习的静态图像穿搭美学评估与优化建议系统的基本实现思路及示例代码&#xff0c;该系统可以分为几个主要部分&#xff1a;数据准备、模型构建、穿搭评估、优化建议生成。 1. 数据准备 首先&#xff0c;你需要一个包含穿搭图像以及对应美学评分的数据集。可…

Apache Kafka单节点极速部署指南:10分钟搭建开发单节点环境

Apache Kafka单节点极速部署指南&#xff1a;10分钟搭建开发单节点环境 Kafka简介&#xff1a; Apache Kafka是由LinkedIn开发并捐赠给Apache基金会的分布式流处理平台&#xff0c;现已成为实时数据管道和流应用领域的行业标准。它基于高吞吐、低延迟的设计理念&#xff0c;能够…

Python解决“找出整形数组中占比超过一半的数”问题

这里写目录标题 问题描述测试样例解决思路代码法1法2 问题描述 小R从班级中抽取了一些同学&#xff0c;每位同学都会给出一个数字。已知在这些数字中&#xff0c;某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1&#xff1a; 输入&…