递归和分治

news2024/11/20 20:17:47

递归

递归(英语:Recursion),在计算机科学中,递归指的是一个函数在其定义中调用自身的方法。这种技术允许程序解决复杂问题,通过将它们分解为更小、更易管理的相似问题。递归通常与分治策略相关联,后者涉及将一个大问题分解为若干个小问题,单独解决这些小问题,然后将结果合并以得到最终解。

递归函数通常具有以下两个主要特征:

  1. 基本情况(Base Case):这是递归停止的条件。在达到基本情况时,函数将停止调用自身。例如,在计算阶乘的递归函数中,0!1! 通常作为基本情况。
  2. 递归步骤(Recursive Step):在这一步中,函数调用自身来解决子问题。这些子问题是原始问题的更小版本。

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

 输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]

示例2:

 输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]

提示:

  1. A中盘子的数目不大于14个。

思路:

先分析简单情况:

一.n=1 时:直接将这个盘子从A拿出,放到C。

二.n=2 时:假设上面的盘子是甲,下面的盘子是乙。

甲:A->B 乙:A->C 甲:B->C

三.n时 :可以把上面n-1个盘子看出一个整体(一个盘子)甲,下面的第n个盘子是乙。

甲:A->B 乙:A->C 甲:B->C

此时:甲:A->B 这个就是一个小问题,把n-1个盘子从A移动到B,可以用C当媒介—递归

​ 甲:B->C 这个也是一个小问题,把n-1个盘子从B移动到C,可以用A当媒介—递归

#include <iostream>
#include <vector>
using namespace std;

void move(int n, vector<int>& source, vector<int>& target, vector<int>& auxiliary) {
    if (n == 1) {
        // 直接移动
        target.push_back(source.back());
        source.pop_back();
    } else {
        // 移动上面的 n-1 个盘子从 source 到 auxiliary
        move(n - 1, source, auxiliary, target);

        // 移动底下的盘子从 source 到 target
        target.push_back(source.back());
        source.pop_back();

        // 移动 n-1 个盘子从 auxiliary 到 target
        move(n - 1, auxiliary, target, source);
    }
}

void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
    move(A.size(), A, C, B);
}

int main() {
    vector<int> A = {3, 2, 1, 0}; // Tower A
    vector<int> B; // Tower B
    vector<int> C; // Tower C

    hanota(A, B, C);

    // Output the result
    cout << "Tower C after moving disks: ";
    for (int disk : C) {
        cout << disk << " ";
    }
    cout << endl;

    return 0;
}

分治算法 (Divide and Conquer)

分治算法是一种特殊类型的递归算法,具体包括以下三个步骤:

  1. 分解(Divide):将原问题分解成一系列子问题。这些子问题是原问题的较小版本,但与原问题具有相同的形式。
  2. 解决(Conquer):递归地解决这些子问题。如果子问题足够小,可以直接求解。
  3. 合并(Combine):将子问题的解合并起来,形成原问题的解。

分治算法的经典例子包括快速排序、归并排序、二分搜索等。在这些算法中,问题被分解成更小的部分,独立解决这些小问题,然后将解合并以解决原始问题。

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

**进阶:**如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

#include <iostream>
#include <vector>
#include <climits>
using namespace std;

class Solution {
public:
    int maxSub(vector<int>& nums, int l, int r){
        if(l == r){
            return nums[l];
        }

        // 递归体——分治求解
        int mid = (l + r) / 2;

        // 左边最大子序和
        int lmax = maxSub(nums, l, mid);
        // 右边最大子序和
        int rmax = maxSub(nums, mid + 1, r);

        // 跨越中点的最大子序和
        int mmax =  mid_sum(nums, l, r, mid);

        // 返回三者中的最大值
        return max(max(lmax, rmax), mmax);
    }

    int mid_sum(vector<int>& nums, int l, int r, int mid){
        // 从中点向左扩展
        int lmax = INT_MIN; // 左边最大值
        int sum = 0; // 当前和
        for(int i = mid; i >= l; i--){
            sum += nums[i];
            lmax = max(lmax, sum);
        }

        // 从中点向右扩展
        int rmax = INT_MIN; // 右边最大值
        sum = 0; // 当前和
        for(int i = mid + 1; i <= r; i++){
            sum += nums[i];
            rmax = max(rmax, sum);
        }

        // 返回左右最大值之和
        return lmax + rmax;
    }

    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        int ans = INT_MIN;
        ans = maxSub(nums,0, n - 1);
        return ans;
    }
};

int main(){
    Solution s;
    vector<int> nums = {-2,1,-3,4,-1,2,1,-5,4};
    cout << s.maxSubArray(nums) << endl;
    return 0;
}

image.png

思路:

1.暴力:枚举起点和终点,计算区间内的和,取最大值。时间复杂度:O(n^2)

2.分治:时间复杂度:O(nlogn)

取中心点m=(l+r)/2。 和最大的区间要么出现在中心点左边,要么出现在中心点右边,要么横跨中心点。所以问题分解为求这三部分的最大区间和,然后取最大值。----分成3个独立的小问题,分治。

(1) 中心点左边的最大区间和:和原问题相同,递归。

(2) 中心点右边的最大区间和:和原问题相同,递归。

(3)横跨中心点的最大区间和:贪心求解—从中心点往左右两边延申。

从中心点不断往左延申,同时记录最大值lmax

从中心点不断往右延申,同时记录最大值rmax

横跨中心点的最大区间和:lmax+rmax

3.动态规划:线性动态规划。时间复杂度 O(n)。

状态:dp[i]=x 以第i个元素结尾的和最大的区间,最大和是 x

初始状态:dp[0]=nums[0]

转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i])

最终答案:max(dp[i])

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

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

相关文章

5-Nacos环境搭建

本文介绍nacos集群环境的搭建。 1、基础环境 机器&#xff1a;mac&#xff0c;intel版本jdk&#xff1a;1.8数据库&#xff1a;mysql 8.029nacos&#xff1a;2.03 2、下载 nacos点击这里下载。 3、开始配置 这里搭建在自己机器上搭建两台nacos集群。下载完成后&#xff0…

Mac使用unrar和rar解压文件

WinRAR archiver, a powerful tool to process RAR and ZIP files 下载 tar -xzvf rarmacos-x64-624.tar.gz cd rar # 安装rar命令 sudo install -c -o $USER rar /usr/local/bin/ # 安装unrar命令 sudo install -c -o $USER unrar /usr/local/bin/ 压缩rar a test.rar readme…

智慧工地网络广播系统

智慧工地网络广播系统 智慧工地网络广播&#xff0c;是智慧公司不可缺少的一环&#xff0c;对于工地广播来说&#xff0c;音质和传输稳定性都是非常重要的要素。尤其是在高楼大厦密集的地方&#xff0c;可能会存在信号干扰和传输受阻的情况&#xff0c;这时候可以考虑使用网络…

hadoop 配置历史服务器 开启历史服务器查看 hadoop (十)

1. 配置了三台服务器&#xff0c;hadoop22, hadoop23, hadoop24 2. hadoop文件路径: /opt/module/hadoop-3.3.4 3. hadoop22机器配置历史服务器的配置文件&#xff1a; 文件路径&#xff1a;/opt/module/hadoop-3.3.4/etc/hadoop 文件名称&#xff1a;mapred-size.xml 新增历…

一文带你了解MySQL数据库基础

✏️✏️✏️今天给各位带来的是关于数据库基础方面的知识。 清风的CDSN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点…

kubernetes测试部署一个nginx

在kubenetes集群中部署一个nginx程序测试集群是否能正常工作 #部署nginx程序 [rootmaster ~]# kubectl create deployment nginx --imagenginx:1.18-alpine #开放端口 [rootmaster ~]# kubectl expose deployment nginx --port80 --typeNodePort #查看pod状态 [rootmaster …

电脑开不了机怎么办?三招帮你成功解决!

电脑是我们日常工作和生活的重要工具&#xff0c;但有时候它们也会出现开机问题。当电脑无法启动时&#xff0c;可能会让人感到焦虑&#xff0c;电脑开不了机怎么办&#xff1f;不必担心&#xff0c;通常有多种方法可以解决这些问题。本文将介绍三种常见的方法&#xff0c;以帮…

【工具与中间件】IDEA工具的使用:热部署、快捷键与版本控制

文章目录 0. 前言1. IDEA 配置热部署2. IDEA 常用快捷键3. IDEA 绑定GIT4. 小结 IDEA工具配置热部署&#xff0c;让我们的开发更有效率 0. 前言 以下是水文字&#xff0c;心急的读者可以直接阅读下面的章节。 有时&#xff0c;新&#xff0c;先进的东西确实可以给这个时代的…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)一

第二部分&#xff1a;Shell编程&#xff08;一&#xff09; 这一章我们正式进入 Shell 脚本编程&#xff0c;重点讲解变量、字符串、数组、数学计算、选择结构、循环结构和函数。 Shell 的编程思想虽然和 C、Java、Python、C# 等其它编程语言类似&#xff0c;但是在语法细节方…

Zynq-Linux移植学习笔记之66- 国产ZYNQ通过裕太PHY8521连接国产交换芯片

1、背景介绍 ZYNQ通过裕太PHY 8521主要连接两种国产交换芯片&#xff0c;一种为盛科的CTC8096&#xff0c;另一种为32所的JEM5396。框图示意如下&#xff1a; 2、硬件状态确认 首先检查phy的模式&#xff0c;确认为SGMII_MAC-RGMII_PHY 可通过读出A001寄存器确认状态 读出来应…

LeetCode(31)无重复字符的最长子串【滑动窗口】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 无重复字符的最长子串 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

APP外包开发项目验收

应用外包开发的验收是确保项目交付质量和客户满意度的关键阶段。以下是一些建议&#xff0c;帮助你进行有效的APP外包开发验收&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确验收标准&#xf…

[Android] Amazon 的 android 音视频开发文档

https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3

掌握源码,轻松搭建:一站式建站系统源码 附完整搭建步骤与教程

随着互联网的快速发展&#xff0c;网站已成为人们生活中不可或缺的一部分。然而&#xff0c;对于许多初学者或中小企业来说&#xff0c;搭建一个完整的网站系统并非易事。这涉及到前端和后端的开发、数据库管理等多个环节。为了解决这一痛点&#xff0c;我们推出了一站式建站系…

Double 4 VR智能互动系统在轨道交通实训教学中的应用

Double 4 VR智能互动系统是一种集成了虚拟现实技术、人工智能和物联网技术的教学系统。计算机通过模拟真实的轨道交通环境&#xff0c;为学生提供了一个高度仿真的学习环境&#xff0c;帮助他们更好地理解和掌握轨道交通的相关知识和技能。 首先&#xff0c;Double 4 VR智能互动…

第十篇 基于JSP 技术的网上购书系统——管理员后台管理主界面、订单管理、产品管理功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.管理员后台管理——主界面 1.1功能说明 1.2界面设计 1.3处理流程 2.订单管理 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关系 2.4.4相关sql实例 3.产品管理 3.1功能说明 3.2界面设计 3.3处理流程…

第十一篇 基于JSP 技术的网上购书系统——产品类别管理、评论/留言管理、注册用户管理、新闻管理功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.产品类别管理 1.1功能说明 1.2界面设计 1.3处理流程 1.4数据来源和算法 1.4.1数据来源 1.4.2 查询条件 1.4.3相关sql实例 2. 评论/留言管理 2.1功能说明 2.2 界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2 查询条件 2.4.3相关sql实例…

【AI】行业消息精选和分析(11月21日 星期二)

技术发展 &#x1f525; OpenAI 员工集体签署信件&#xff1a; - 员工要求董事会辞职并重新任命首席执行官奥特曼。 - 否则可能集体加入微软。 昨天就玩我们领导发言&#xff0c;后面大家接龙收到的那一套了。 &#x1f632; 奥特曼加入微软引发猜测&#xff1a; - 对于一个公…

RESTful API 设计指南——开篇词

引言 十年后的今天&#xff0c;我终于学会了RESTful API。 以上&#xff0c;就是我最近一个月的心路历程。入职新公司不到2周&#xff0c;自己都还没完全理解RESTful API就要求给校招应届生培训&#xff0c;着实压力山大。培训结束后也感觉收获颇丰&#xff0c;遂总结分享出来&…