【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.pswp.cn/web/9922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9922.shtml
英文地址,請注明出處:http://en.pswp.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 <…