数据结构极客视频4

题目 leetcode50

在这里插入图片描述
解题思路 使用分治的方法 O(logN) 考虑N是单数还是双数 代码分为非递归与递归版
非递归

class Solution:
    def myPow(self, x: 'float', n: 'int') -> 'float':
        if n<0:
            x=1/x
            n=-n
        p =1
        while n:
            if n%2==1:
                p *=x
            x*=x
            n>>=1
        return p

递归

class Solution:
    def myPow(self, x: 'float', n: 'int') -> 'float':        
        if not n:
            return 1
        if n<0:
            return 1/self.myPow(x,-n)
      
        if n%2:
            return self.myPow(x,n-1)*x
        return self.myPow(x*x,n/2)
        

贪心算法

贪心算法使用场景

在这里插入图片描述

贪心算法题目 股票买卖

在这里插入图片描述

BFS与DFS 广度优先于深度优先搜索

广度优先

在这里插入图片描述
BFS 借用一个队列实现 队列的先进先出的特点 可以保证当前节点的孩子进去后 比下一个节点的孩子进去后先出来

def BFS(graph,start,end):
    queue =[]
    queue.append([start])
    visited.add(start)##对于树用不到  图的话 用得到
    while queue:
        node = queue.pop()
        visited.add(node)
        
        process(node)
        nodes = generate_related_nodes(node)## 找后继节点 并且后继节点没有被访问过
        queue.push(nodes)

深度优先

深度优先搜索 使用栈结果 栈的先进后出的性质 正好应用到深度优先中 由于递归也是使用栈实现的 所以代码可以有递归版本和非递归版本

递归版本

visited = set()## 图需要 检查是否重复
def  dfs(node,visited):
    visited.add(node)
    
    for next_node in node.children():
        if not next_node in visited:
            dfs(next_node,visited)

非递归版本

def DFS(self,tree):
    if tree.root is None:
        return []
    visited,stack=[],[tree.root]
    
    while stack:
        node = stack.pop()
        visited.add(node)
        
        precess(node)
        nodes = generate_related_nodes(node)
        stack.push(nodes)

题目 分层打印二叉树

在这里插入图片描述


方法1使用广度优先bfs 使用bfs 肯定用队列 先进先出 使用current_level记录当前行 注意下面代码是模板 如果是图的话 用visited记录下


def leveOrder(self,root):
    if not root:return []
    
    result = []
    queue = collections.deque()##使用双端队列
    queue.append(root) ##加到双端队列的右边
    
    # visited =set(root)
     while queue:
            level_size = len(queue)
            current_level =[]
            
            for _ in range(level_size):
                node = queue.popleft() ## 右边进 左边出
                current_level.append(node.val)
                if node.left:queue.append(node.left)
                if node.right:queue.append(node.right)
            result.append(current_level)
    return result

方法2 使用深度优先

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

class Solution:
    def levelOrder(self, root: 'TreeNode') -> 'List[List[int]]':
        if not root:
            return []
        self.result=[]##二维列表[[]]第一层记录的是二叉树中的层数 第二层记录的是数
        self.dfs(root,0)
        return self.result
    def dfs(self,root,level):
        if not root:return []
        if len(self.result)<level+1:
            self.result.append([])
        self.result[level].append(root.val)
        self.dfs(root.left,level+1)
        self.dfs(root.right,level+1)
        

题目 所有括号问题

在这里插入图片描述
在这里插入图片描述
使用深度优先的思想 并使用了剪枝策略 给定N 那么会有2*n的位置 一半是左括号 一半是右括号 使用深度优先搜索

class Solution:
    def generateParenthesis(self, n: 'int') -> 'List[str]':
        self.result=[]
        self._gen(0,0,n,"")
        return self.result
    def _gen(self,left,right,n,result):
        if n<=0:
            return result
        if left==n and right==n:
            self.result.append(result)
            return
        if left<n:
            self._gen(left+1,right,n,result+'(')
        if right<n and right<left:
            self._gen(left,right+1,n,result+')')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值