【C++刷题】优选算法——递归第一辑

  • 什么是递归?
    函数自己调用自己的情况
  • 为什么会用到递归?
    本质:在解决主问题的时候衍生出一个相同处理过程的子问题,子问题再继续衍生子问题…
  • 如何理解递归?
    • 第一层次的理解:递归展开的细节图
    • 第二层次的理解:二叉树题目练习
    • 第三层次的理解:宏观看待递归过程
      • a. 不要再在意递归的细节展开图
      • b. 把递归的函数当成一个黑盒
      • c. 相信这个黑盒一定能完成既定任务
  • 如何写好一个递归?
    • a. 先找到主问题和子问题的相同处理过程!!!-> 可以用于处理函数头的设计
    • b. 只关心某一个子问题是如何解决的 -> 可以用于处理函数体的书写
    • c. 注意一下递归函数的出口即可\
  1. 汉诺塔问题
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:n个盘子,从A柱子,借助B柱子,移动到C柱子 -> void dfs(int n, vector<int>& A, vector<int>& B, vector<int>& C)
void dfs(int n, vector<int>& A, vector<int>& B, vector<int>& C)
{if(n == 1){C.push_back(A.back());A.pop_back();return;}dfs(n-1, A, C, B);C.push_back(A.back());A.pop_back();dfs(n-1, B, A, C);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C)
{dfs(A.size(), A, B, C);
}
  1. 合并两个有序链表
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:合并两个有序链表 -> ListNode* dfs(list1, list2);
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{if(list1 == nullptr) return list2;else if(list2 == nullptr) return list1;if(list1->val <= list2->val){list1->next = mergeTwoLists(list1->next, list2);return list1;}else{list2->next = mergeTwoLists(list1, list2->next);return list2;}
}
  1. 反转链表
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:反转一个链表 -> ListNode* dfs(list1);
ListNode* reverseList(ListNode* head)
{if(head == nullptr || head->next == nullptr) return head;ListNode* newHead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newHead;
}
  1. 两两交换链表中的节点
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:两两交换链表中的节点 -> ListNode* dfs(ListNode* list1)
ListNode* swapPairs(ListNode* head)
{if(head == nullptr || head->next == nullptr) return head;ListNode* newHead = head->next;head->next = newHead->next;newHead->next = head;head->next = swapPairs(head->next);return newHead;
}
  1. Pow(x, n)
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:求 x 的 n 次幂 -> int dfs(int x, int n);
double dfs(double x, int n)
{if(n == 0) return 1;double tmp = dfs(x, n / 2);return n % 2 ? tmp * tmp * x : tmp * tmp;
}
double myPow(double x, int n)
{if(n > 0) return dfs(x, n);else return 1 / dfs(x, n);
}
  1. 计算布尔二叉树的值
找到主问题和子问题的相同处理过程 -> 用于处理函数头的设计:返回一棵完整二叉树的布尔值 -> bool dfs(TreeNode* root);
bool evaluateTree(TreeNode* root)
{if(root->val == 0) return false;else if(root->val == 1) return true;if(root->val == 2) return evaluateTree(root->left) || evaluateTree(root->right);else return evaluateTree(root->left) && evaluateTree(root->right);
}
  1. 求根节点到叶节点数字之和
int dfs(TreeNode* root, int val)
{val = val * 10 + root->val;if(root->left == nullptr && root->right == nullptr) return val;int left = 0, right = 0;if(root->left) left = dfs(root->left, val);if(root->right) right = dfs(root->right, val);return left + right;
}
int sumNumbers(TreeNode* root)
{return dfs(root, 0);
}
  1. 二叉树剪枝
TreeNode* pruneTree(TreeNode* root)
{if(root == nullptr) return nullptr;root->left = pruneTree(root->left);root->right = pruneTree(root->right);if(root->left == nullptr && root->right == nullptr && root->val == 0)return nullptr;return root;
}
  1. 验证二叉搜索树
二叉搜索树的中序遍历是有序的
long long prev = LLONG_MIN;
bool isValidBST(TreeNode* root)
{if(root == nullptr) return true;// 剪枝if(isValidBST(root->left) == false) return false;if (prev < (root->val)) prev = root->val;else return false; // 剪枝return isValidBST(root->right);
}
  1. 二叉搜索树中第K小的元素
int value = -1;
int count = 0;
void dfs(TreeNode* root)
{if(root == nullptr) return;dfs(root->left);if(count == 0) return;if(value < root->val){value = root->val;--count;}dfs(root->right);
}
int kthSmallest(TreeNode* root, int k)
{count = k;dfs(root);return value;
}
  1. 二叉树的所有路径
vector<string> v;
void dfs(TreeNode* root, string s)
{if(root->left == nullptr && root->right == nullptr){s += to_string(root->val);v.push_back(s);return;}s += to_string(root->val);s += "->";if(root->left) dfs(root->left, s);if(root->right) dfs(root->right, s);
}
vector<string> binaryTreePaths(TreeNode* root)
{dfs(root, "");return v;
}

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

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

相关文章

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?&#xff0c;巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…

mybatis 多表查询

一对一&#xff1a; 第一&#xff1a;在一中的类添加另外一个类作为属性。如&#xff08;在Order类中添加private User orderUser;&#xff09; 第二&#xff1a;在mapper.xml配置关联。&#xff08;mapper接口不变&#xff09; <!-- resultMap标签&#xff1a;解决查询结…

Redis 源码安装和入门介绍

Linux下的redis源码安装 redis介绍 Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c;…

智能商品计划系统:引领未来零售业的革新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和大数据技术已成为推动各行业革新的关键动力。在零售行业中&#xff0c;智能商品计划系统的出现&#xff0c;正逐步改变着传统的商品规划与管理方式&#xff0c;为品牌注入新的活力与竞争力。本文将对智能商…

Java入门基础学习笔记14——数据类型转换

类型转换&#xff1a; 1、存在某种类型的变量赋值给另一种类型的变量&#xff1b; 2、存在不同类型的数据一起运算。 自动类型转换&#xff1a; 类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。 byte类型赋值给int类型&#xff0c;就是自动类型转换。 pack…

基于大数据的医疗信息化系统

基于大数据的医疗信息化系统是一个复杂且不断发展的领域,它结合了现代信息技术和医疗专业知识,以提高医疗服务的效率、质量和可及性。以下是一个关于基于大数据的医疗信息化系统的概述 一、引言 随着信息技术的快速发展和医疗改革的深入推进,医疗信息化已成为医疗领域的重…

Android 屏幕适配全攻略(中)-从九宫格到矢量图,揭秘Android多屏幕适配的正确打开方式

在移动互联网时代&#xff0c;无论是小小的手机屏幕&#xff0c;还是大大的平板显示器&#xff0c;Android 应用都必须做到完美适配&#xff0c;给用户以极佳的体验。本文将剖析 Android 多屏幕适配背后的种种技术细节&#xff0c;为您揭开最佳实践的正确打开方式&#xff0c;让…

速卖通ip地址会相互影响吗?如何防止账号关联?

在跨境电商行业&#xff0c;大部分平台都是不允许一个卖家操作多个店铺的&#xff0c;如果被平台检测出账户关联&#xff0c;可能会被封店。在速卖通平台&#xff0c;会通过IP地址来判断是否经营多个账号吗?IP地址会使店铺相互影响吗? 一、速卖通IP地址会关联吗? 首先各位卖…

解决mybatis的配置文件没代码提示的问题

1.将org.apache.ibatis.builder.xml包里的两个dtd文件复制出来&#xff0c;jar包里复制 2.复制dtd的url地址&#xff1a; http://mybatis.org/dtd/mybatis-3-mapper.dtd 一样的做法&#xff01; 3.关闭两个配置文件&#xff0c;重新打开&#xff0c;就可以有代码提示了&…

【智能优化算法】白鲨智能优化算法(White Shark Optimizer,WSO)

白鲨智能优化算法(White Shark Optimizer,WSO)是期刊“KNOWLEDGE-BASED SYSTEMS”&#xff08;中科院一区期刊 IF8.6&#xff09;的2022年智能优化算法 01.引言 白鲨智能优化算法(White Shark Optimizer,WSO)的核心理念和基础灵感来自大白鲨的行为&#xff0c;包括它们在导航和…

从项目开始学习Vue——02(若依框架)

往期&#xff1a; 从项目开始学习Vue——01 目录标题 一、基础插件&#xff08;一&#xff09;路由Vue Router&#xff08;二&#xff09;导航守卫&#xff08;路由拦截器&#xff09;二、Vuex&#xff08;一&#xff09;什么是VuexVuex的部分介绍内容&#xff1a; &#xff08…

QQ超大文件共享(别用,传进去后,压缩都显示不出来,LJ qq!)(共享文件)

文章目录 需要共享双方同时在线开启方法第一次会提示设置默认共享目录&#xff0c;默认是E:\QQFileShare\<qq号>\&#xff1a;然后新建共享会在其后创建共享目录&#xff0c;共享目录中只能共享文件。需要点击添加文件&#xff0c;直接把文件拷贝到目录里好像还不行&…

C语言/数据结构——(相交链表)

一.前言 今天在力扣上刷到了一道题&#xff0c;想着和大家一起分享一下这道题——相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists废话不多说&#xff0c;让我们开始今天的分享吧。 二.正文 1.1题目描述 是不是感觉好长&#xff0c;我也这么觉得。哈…

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…

OAuth 2.0 和 OAuth 2.1

OAuth 2.0 和 OAuth 2.1比较&#xff1a; OAuth 2.0 和 OAuth 2.1 是授权框架的不同版本&#xff0c;它们用于允许应用程序安全地访问用户在另一个服务上的数据。以下是它们之间的一些主要区别&#xff1a; 安全性增强&#xff1a;OAuth 2.1 旨在提高安全性&#xff0c;它整合…

什么是云原生架构,我们该如何做好云原生安全,引领云计算时代的应用程序革新

随着云计算技术的飞速发展&#xff0c;企业面临着前所未有的机遇和挑战。在这个高度竞争的市场中&#xff0c;传统的应用程序架构因其僵化、不易扩展和维护的特点&#xff0c;已难以满足当今企业对灵活性、可伸缩性和高效性的追求。在这样的背景下&#xff0c;云原生架构应运而…

git rebase 合并当前分支的多个commit记录

git rebase 合并当前分支的多个commit记录 git rebase 相关的选项和用法step1&#xff1a;找到想要合并的 commitstep2. 使用 rebase -istep3. 编辑提交历史&#xff1a;step4.编辑合并后的提交信息step5.完成 rebase 过程&#xff1a;step6.**推送更新&#xff1a;**step6.**再…

使用ollama离线部署小模型

在有网的机器下载ollama和模型 启动服务 docker run --rm -it -v ./ollama:/root/.ollama -p 8000:11434 --name ollama ollama/ollama下载模型 docker exec -it ollama ollama pull qwen:0.5b将镜像和ollama目录复制到离线的机器中 docker启动ollama服务 验证 curl ht…

FFmpeg常用API与示例(三)—— 音视频解码与编码

编解码层 1.解码 (1) 注册所有容器格式和 CODEC:av_register_all() (2) 打开文件:av_open_input_file() (3) 从文件中提取流信息:av_find_stream_info() (4) 穷举所有的流&#xff0c;查找其中种类为 CODEC_TYPE_VIDEO (5) 查找对应的解码器:avcodec_find_decoder() (6) …

C++ 实现以xml的格式写入文件

C XML类 该类主要将xml中的标签分为两类&#xff0c;无内容标签统一称为父标签&#xff0c;有内容的就以键值对的方式直接输出。 后面可能会优化通过函数参数的方式管控层级关系&#xff0c;现在是通过类里自动记录层级深度来表示的。 #include <fstream> #include <…