【算法系列篇】遞歸、搜索和回溯(二)

在這里插入圖片描述

文章目錄

  • 前言
  • 1. 兩兩交換鏈表中的節點
    • 1.1 題目要求
    • 1.2 做題思路
    • 1.3 代碼實現
  • 2. Pow(X,N)
    • 2.1 題目要求
    • 2.2 做題思路
    • 2.3 代碼實現
  • 3. 計算布爾二叉樹的值
    • 3.1 題目要求
    • 3.2 做題思路
    • 3.3 代碼實現
  • 4. 求根節點到葉結點數字之和
    • 4.1 題目要求
    • 4.2 做題思路
    • 4.3 代碼實現

前言

前面為大家介紹了關于遞歸的知識,以及使用遞歸解決了幾個問題,那么這篇文章將帶大家鞏固一下關于遞歸的知識。

1. 兩兩交換鏈表中的節點

https://leetcode.cn/problems/swap-nodes-in-pairs/description/

1.1 題目要求

給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。

示例 1:
在這里插入圖片描述

輸入:head = [1,2,3,4]
輸出:[2,1,4,3]

示例 2:

輸入:head = []
輸出:[]

示例 3:

輸入:head = [1]
輸出:[1]

提示:

鏈表中節點的數目在范圍 [0, 100] 內
0 <= Node.val <= 100
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {}
}

1.2 做題思路

這道題目其實可以使用非遞歸的方式來實現,但是我們可以使用遞歸的方式來加深一下遞歸的學習。

這個題目不復雜,比較簡單,我們可以將 head 和 head.next 看成一部分,另外的節點看成另一部分,開始我們直接將后面部分的節點交給函數處理,相信它一定可以幫助我們完成兩兩節點的交換,當后面部分的節點交換完成之后,我們再交換 head 和 head.next 節點,然后再將這兩個部分連接起來。

在這里插入圖片描述

這是一種思路,我們也可以先交換前面部分,然后再交換后面部分。

在這里插入圖片描述

上面兩種思路其實都差不多的,只是先交換還是后交換的區別。

1.3 代碼實現

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) return head;ListNode l1 = swapPairs(head.next.next);ListNode ret = head.next;head.next.next = head;head.next = l1;return ret;}
}

在這里插入圖片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) return head;ListNode curNext = head.next.next;ListNode ret = head.next;head.next.next = head;head.next = swapPairs(curNext);return ret;}
}

在這里插入圖片描述

2. Pow(X,N)

https://leetcode.cn/problems/powx-n/

2.1 題目要求

實現 pow(x, n) ,即計算 x 的整數 n 次冪函數(即,xn )。

示例 1:

輸入:x = 2.00000, n = 10
輸出:1024.00000

示例 2:

輸入:x = 2.10000, n = 3
輸出:9.26100

示例 3:

輸入:x = 2.00000, n = -2
輸出:0.25000
解釋:2-2 = 1/22 = 1/4 = 0.25

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
n 是一個整數
要么 x 不為零,要么 n > 0 。
-104 <= xn <= 104
class Solution {public double myPow(double x, int n) {}
}

2.2 做題思路

其實這道題也叫做快速冪,為什么叫做快速冪呢?給大家舉個例子:假設我們要求2^8,普通的做法就是2x2x2x2x2x2x2x2,但是呢?2 ^ 8可以寫成 2 ^ 4 x 2 ^ 4,而 2 ^ 4 又可以寫成 2 ^ 2 x 2 ^ 2,2 ^ 2可以寫成 2 x 2,2 可以寫成 1 x 2。也就是說 2 ^ n 可以寫成 2 ^ (n / 2) x 2 ^ (n / 2),我們每次只需要計算 2 ^ (n / 2) 的值及,就可以了,通過這種快速冪的方法,就可以大大節省計算的時間。

當冪為偶數的話就可以每次求 x 的 n / 2 次冪,但是如果冪數為奇數該怎么辦呢?這也不復雜,當冪數為奇數的時候,我們只需要在 n / 2 次冪 x n / 2 次冪后面在乘上一個 x 就可以了。舉個例子:2 ^ 5就可以寫成 2 ^ 2 x 2 ^ 2 x 2。

2.3 代碼實現

class Solution {public double myPow(double x, int n) {//處理冪數的正負問題if (n < 0) return 1.0 / quickPow(x, n);else return quickPow(x, n);}private double quickPow(double x, int n) {if (n == 0) return 1.0;double t = quickPow(x, n / 2);//處理冪數的奇偶問題return n % 2 == 0 ? t * t : t * t * x;}
}

在這里插入圖片描述

3. 計算布爾二叉樹的值

https://leetcode.cn/problems/evaluate-boolean-binary-tree/

3.1 題目要求

給你一棵 完整二叉樹 的根,這棵樹有以下特征:

葉子節點 要么值為 0 要么值為 1 ,其中 0 表示 False ,1 表示 True 。
非葉子節點 要么值為 2 要么值為 3 ,其中 2 表示邏輯或 OR ,3 表示邏輯與 AND

計算 一個節點的值方式如下:

如果節點是個葉子節點,那么節點的 值 為它本身,即 True 或者 False 。
否則,計算 兩個孩子的節點值,然后將該節點的運算符對兩個孩子值進行 運算 。
返回根節點 root 的布爾運算值。

完整二叉樹 是每個節點有 0 個或者 2 個孩子的二叉樹。

葉子節點 是沒有孩子的節點。

示例 1:
在這里插入圖片描述

輸入:root = [2,1,3,null,null,0,1]
輸出:true
解釋:上圖展示了計算過程。
AND 與運算節點的值為 False AND True = False 。
OR 運算節點的值為 True OR False = True 。
根節點的值為 True ,所以我們返回 true 。

示例 2:

輸入:root = [0]
輸出:false
解釋:根節點是葉子節點,且值為 false,所以我們返回 false 。

提示:

樹中節點數目在 [1, 1000] 之間。
0 <= Node.val <= 3
每個節點的孩子數為 0 或 2 。
葉子節點的值為 0 或 1 。
非葉子節點的值為 2 或 3 。
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean evaluateTree(TreeNode root) {}
}

3.2 做題思路

這道題目的意思就是如果遇到的節點是一個葉子節點的話,如果當前節點的值為0的話就返回False,為1的話就返回True;如果當前節點不是葉子節點的話,就需要根據這個節點的父親節點的值與這個節點的兄弟節點進行操作,如果父親節點是2的話,就進行 | 操作,3就進行 & 操作。

一般遇到二叉樹就會想到遞歸,這道題也不例外。我們先將根節點的左樹交給函數,讓函數幫助我們進行布爾值的計算,然后再將根節點的右樹交給函數進行布爾值的運算,最后將左右子樹的值與根節點表示的值進行 | 或者 & 運算。

在這里插入圖片描述

3.3 代碼實現

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean evaluateTree(TreeNode root) {//當root為null時返回trueif (root == null) return true;//遇到葉子節點根據節點的值返回if (root.left == null && root.right == null) {if (root.val == 0) return false;else return true;}boolean l = evaluateTree(root.left);boolean r = evaluateTree(root.right);if (root.val == 2) return l | r;else return l & r;}
}

在這里插入圖片描述

4. 求根節點到葉結點數字之和

https://leetcode.cn/problems/sum-root-to-leaf-numbers/

4.1 題目要求

給你一個二叉樹的根節點 root ,樹中每個節點都存放有一個 0 到 9 之間的數字。
每條從根節點到葉節點的路徑都代表一個數字:

例如,從根節點到葉節點的路徑 1 -> 2 -> 3 表示數字 123 。
計算從根節點到葉節點生成的 所有數字之和 。

葉節點 是指沒有子節點的節點。

示例 1:
在這里插入圖片描述

輸入:root = [1,2,3]
輸出:25
解釋:
從根到葉子節點路徑 1->2 代表數字 12
從根到葉子節點路徑 1->3 代表數字 13
因此,數字總和 = 12 + 13 = 25

示例 2:

在這里插入圖片描述

輸入:root = [4,9,0,5,1]
輸出:1026
解釋:
從根到葉子節點路徑 4->9->5 代表數字 495
從根到葉子節點路徑 4->9->1 代表數字 491
從根到葉子節點路徑 4->0 代表數字 40
因此,數字總和 = 495 + 491 + 40 = 1026

提示:

樹中節點的數目在范圍 [1, 1000] 內
0 <= Node.val <= 9
樹的深度不超過 10
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int sumNumbers(TreeNode root) {}
}

4.2 做題思路

這道題目也不難,只要能理解二叉樹的的前序遍歷就可以了,這道題目其實就是二叉樹的前序遍歷。我們先將根節點的左子樹交給函數得到左子樹上從根節點到各個葉子節點路徑上的數字之和,然后將根節點的右子樹上的從根節點到各個葉子節點路徑上的數字之和,然后返回左子樹和右子樹返回值的和。

4.3 代碼實現

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}//n用來記錄當前路徑上該節點之前的各個節點的和private int dfs(TreeNode root, int n) {if (root == null) return 0;//遇到一個節點就將當前節點的值加在n上n = n * 10 + root.val;//遇到葉子節點就說明當前節點的值計算完成,就返回路徑上所以數字和if (root.left == null && root.right == null) return n;//分別計算根節點左右子樹上根節點到葉子節點路徑上數字和int l = dfs(root.left, n);int r = dfs(root.right, n);//返回左子樹和右子樹所有路徑上數字和return l + r;}
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機畢業設計springboot+ssm停車場車位預約系統java

管理員不可以注冊賬號 停車位包括車位所在樓層、車位編號、車位類型(全時間開放/高峰期開放)、預定狀態等 用戶預約時要求支付預約時間段的停車費用 違規行為&#xff1a;1.停車超過預約時間段 2.預約未使用 于系統的基本要求 &#xff08;1&#xff09;功能要求&am…

6G來襲,真的有必要嗎?

6G來襲&#xff0c;6G標準將在2025年完成制定&#xff0c;2030年商用。當5G都還沒玩明白的時候&#xff0c;6G又來了。 這次6G又提出了三個全新高大上場景&#xff0c;感知通信、人工智能通信、天地一體泛在物聯&#xff0c;精英們還說&#xff0c;未來要連接很多機器人、元宇宙…

PHP基礎 - 循環與條件語句

循環語句 1)for循環: 重復執行一個代碼塊指定的次數。 for ($i = 0; $i < 5; $i++) { // 初始化 $i 為 0,每次循環后將 $i 值增加 1,當 $i 小于 5 時執行循環echo "The number is: $i \n"; // 輸出當前 $i 的值并換行 }// 循環輸出結果為: // The number …

mysql字段設計規范:使用unsigned(無符號的)存儲非負值

如果一個字段存儲的是數值&#xff0c;并且是非負數&#xff0c;要設置為unsigned&#xff08;無符號的&#xff09;。 例如&#xff1a; 備注&#xff1a;對于類型是 FLOAT、 DOUBLE和 DECIMAL的&#xff0c;UNSIGNED屬性已經廢棄了&#xff0c;可能在mysql的未來某個版本去…

mysql分別在windows和linux下的備份策略

嗟乎&#xff01; 一、概述 mysql數據庫該怎么備份呢&#xff1f; 數據庫備份有幾個概念&#xff1a;全量備份、增量備份、差異備份。當然啦&#xff0c;數據庫備份又有冷備份和熱備份&#xff0c;即物理備份和邏輯備份之分。冷備份就是將mysql停了&#xff0c;然后直接拷貝…

Python入門第2篇

pip包管理器 包管理器類似.NET下的nuget&#xff0c;主要用于管理引用依賴項。 安裝Python的時候&#xff0c;已經默認安裝了pip包管理器&#xff0c;因此無需單獨安裝 cmd&#xff0c;輸入&#xff1a;pip --version 顯示pip版本號信息&#xff0c;即代表pip安裝成功&…

前端知識筆記(四十二)———http和https詳細解析

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一種用于在計算機網絡中傳輸超文本的協議。它是一個客戶端-服務器協議&#xff0c;用于從 Web 服務器傳輸超文本到本地瀏覽器。HTTP 使用 TCP/IP 協議作為底層傳輸協議&#xff0c;并使用默認端口號80。 HTTPS&…

8-tornado中模板的使用(通過字符串返回、通過模板Template返回、通過模板render返回)、模板案例

1 Template 1.1 通過字符串返回 import tornado class IndexHandler(web.RequestHandler):def get(self):arg Templateself.finish(f<h1>Hello {arg}!!</h1>)1.2 通過模板Template返回 tornado.template 一個簡單的模板系統&#xff0c;將模板編譯為Python代碼。…

c 一,二,三維數組的定義和賦值

1. 定義數組必須指定數組的大小&#xff0c;也就是用多少存儲空間來存儲此數組 2.定義數組必須用數組的標準格式定義&#xff1a;數組名下標的形式 3.只有字符串可以用指針來定義 4.可以把c 中一切數和struct 理解為char 數組 比如int 就是4字節的char數組 #include <…

編程語言的演進歷程與未來發展趨勢

第一代 編程語言的發展歷程起源于早期的機器語言階段&#xff0c;這是一種由二進制代碼構成的計算機能夠直接解讀并執行的語言。然而&#xff0c;鑒于其過于復雜且難以理解&#xff0c;故這一時代的語言并不常為人類所采納。 第二代 緊接著產生的第二代語言旨在簡化編程過程…

1001 害死人不償命的(3n+1)猜想

卡拉茲(Callatz)猜想&#xff1a; 對任何一個正整數 n&#xff0c;如果它是偶數&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇數&#xff0c;那么把 (3n1) 砍掉一半。這樣一直反復砍下去&#xff0c;最后一定在某一步得到 n1。卡拉茲在 1950 年的世界數學家大會上公布了…

C++ //習題2.5 請寫出下列表達式的值。

C程序設計 &#xff08;第三版&#xff09; 譚浩強 習題2.5 習題2.5 請寫出下列表達式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 設a的初值為3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

UI自動化測試工具的定義及重要性

UI自動化測試工具在現代軟件開發中起著不可或缺的作用。它們能夠提高測試效率、減少人為錯誤、提供全面的測試覆蓋&#xff0c;并支持持續集成。通過有效使用UI自動化測試工具&#xff0c;開發團隊可以提高軟件質量&#xff0c;提供更可靠的應用程序&#xff0c;滿足用戶的需求…

C語言之數組精講(2)

目錄 數組的復制 輸入數組元素的值 對數組的元素進行倒序排列 使用數組進行成績處理 對象式宏 數組元素的最大值和最小值 賦值表達式的判斷 數組的元素個數 結語 數組的復制 我們把數組中的元素全部復制到另一個數組中。 #include<stdio.h>int main() {int i;int…

SwinIR: Image Restoration Using Swin Transformer

SwinIR 簡介 論文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代碼&#xff1a;SwinIR ? 本文提出了一個基于swin transformer的圖像超分模型swinIR。其中SwinIR分為三部分&#xff1a;淺層特征提取、深層特征提取和高質量圖像重建模塊。 現階段問…

WordPress如何通過header給頁面發送原生HTTP頭

在WordPress中&#xff0c;你可以使用header() 函數來發送原生HTTP頭。這個函數通常在主題文件&#xff08;例如header.php&#xff09;或者插件中使用。以下是一個簡單的例子&#xff0c;演示如何在WordPress中使用header() 函數發送原生HTTP頭&#xff1a; <?php // 在主…

19.java程序設計-基于SpringBoot的博客管理系統的設計與實現

摘要 隨著信息技術的迅速發展&#xff0c;博客作為一種重要的信息傳播和交流工具&#xff0c;逐漸在互聯網上占據重要地位。為了滿足用戶對個性化博客管理的需求&#xff0c;本研究設計并實現了一種基于Spring Boot框架的博客管理系統。 本系統通過采用前后端分離的架構&…

【算法題】密鑰格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

【C++11(三)】智能指針詳解--RAII思想循環引用問題

&#x1f493;博主CSDN主頁:杭電碼農-NEO&#x1f493; ? ?專欄分類:C從入門到精通? ? &#x1f69a;代碼倉庫:NEO的學習日記&#x1f69a; ? &#x1f339;關注我&#x1faf5;帶你學習C ? &#x1f51d;&#x1f51d; C11 1. 前言2. 為什么要有智能指針?3. RAII思想…

30.如何在Spring所有Bean創建完后做擴展?

如何在Spring所有Bean創建完后做擴展? 哪里才算所有的bean創建完了。 首先是所有的配置bean會注冊成BeanDefinition 然后根據BeanDefinition進行循環調用一個一個的getBean進行生產。 循環完所有的BeanDefiniton,通過BeanFactory的getBean方法生成所有的Bean 這個循環結…