《極客時間--算法面試》--貪心算法

 

廣度優先搜索算法,這個代碼不只適應於樹也適應於圖。圖會有迴路結構,須要判重,採用set去重。node

二叉樹的最大10四、最小深度111算法

思路:app

  1、採用遞歸的思路spa

  2、採用BFS廣度優先搜索code

  3、深度優先搜索blog

此圖是廣度優先搜索算法,一層一層去遍歷,終點是找到葉子節點爲止。遞歸

最開始的葉子節點是最小深度,最後到達的是最大深度。leetcode

此圖是深度優先搜索的方法,每次遍歷更新最大和最小。仍是以判斷葉子節點。get

時間複雜度都爲O(n),由於總共有n個節點,都須要遍歷一次,因此是O(n)it

雖然推理是採用廣度或者深度優先的策略,可是實際代碼採用的是遞歸的思路寫的。

二叉樹的最大深度代碼:

# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None

class Solution(object): def maxDepth(self, root): """ :type root: TreeNode :rtype: int """
        if not root: return 0                                                        #若是是葉子節點則返回0
        return 1+max(self.maxDepth(root.left),self.maxDepth(root.right))    #調用左子樹和右子樹,最大值加1

二叉樹的最小深度代碼:

# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None

class Solution(object): def minDepth(self, root): """ :type root: TreeNode :rtype: int """
        if not root:                                    #若是是空節點,直接返回0
            return 0 if not root.left:                               #若是左子節點爲空,那麼去查找右子樹的節點
            return 1+self.minDepth(root.right) elif not root.right:                            #同理,若是右子節點爲空,那麼去查找左子樹的節點
            return 1+self.minDepth(root.left) else:                                           #不然,說明有左右子節點,左右子樹的最小值加1
            return 1+min(self.minDepth(root.left),self.minDepth(root.right)) 

括號生成

https://leetcode-cn.com/problems/generate-parentheses/submissions/

思路:

  我也沒聽懂,後期花點時間弄懂,暫記着。

  

 

代碼:

class Solution(object): def generateParenthesis(self, n): """ :type n: int :rtype: List[str] """ self.list = [] self._gen(0,0,n,"") return self.list def _gen(self,left,right,n,result): if left==n and right==n:                            #左右括號已經配額完畢
            self.list.append(result)                        #將result加入到結果當中
            return 
        if left < n: self._gen(left+1,right,n,result+'(')            #加入左括號,隨時均可以加進去,只要沒有用完均可以
        if left>right and right<n:                          #右括號個數小於左括號而且右括號沒有用完
            self._gen(left,right+1,n,result+')')            #加入右括號
相關文章
相關標籤/搜索