Leetcode 算法面试冲刺 热题 HOT 100 刷题(102 104 105 114 121)(六十)

news/2024/7/7 4:15:27 标签: leetcode, 算法, 面试

文章目录

  • 102. 二叉树的层序遍历
  • 104. 二叉树的最大深度
  • 105. 从前序与中序遍历序列构造二叉树
  • 114. 二叉树展开为链表
  • 121. 买卖股票的最佳时机

102. 二叉树的层序遍历

在这里插入图片描述
在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        q = deque([root])
        res = []
        while q:
            tmp = []
            for i in range(len(q)):
                node = q.popleft()
                tmp.append(node.val)
                if node.left: q.append(node.left)
                if node.right: q.append(node.right)
            res.append(tmp)
        return res

104. 二叉树的最大深度

在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root: return 0

        left_height = self.maxDepth(root.left)
        right_height = self.maxDepth(root.right)
        return max(left_height, right_height) + 1

说实话,看着这题很简单,其实我知道答案,再写也没写出来,有时候看着简单的题,其实需要很多的思考过程才能写出来。代码简单不代表真的简单。

def maxDepth(self, root):
        if not root: return 0
        left_height = self.maxDepth(root.left)
        right_height = self.maxDepth(root.right)
        return max(left_height, right_height) + 1

105. 从前序与中序遍历序列构造二叉树

在这里插入图片描述
在这里插入图片描述
如果手写我知道怎么弄,但是写代码不知道怎么将左右子树分开。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尝试写了一下,还是没写出来:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder or not inorder:
            return
        preleft, preright = 0, len(preorder) - 1
        inleft, inright = 0, len(inorder) - 1
        pivot_index = inorder.index(preorder[preleft])
        root = TreeNode(val = inorder[pivot_index])
        root.left = buildTree(preorder[preleft + 1: pivot_index - inleft + preleft + 1)
        root.right = buildTree(pivot_index - inleft + preleft + 1: preright + 1) 
        return root

下面是答案:

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def myBuildTree(preorder_left: int, preorder_right: int, inorder_left: int, inorder_right: int):
            if preorder_left > preorder_right:
                return None
            
            # 前序遍历中的第一个节点就是根节点
            preorder_root = preorder_left
            # 在中序遍历中定位根节点
            inorder_root = index[preorder[preorder_root]]
            
            # 先把根节点建立出来
            root = TreeNode(preorder[preorder_root])
            # 得到左子树中的节点数目
            size_left_subtree = inorder_root - inorder_left
            # 递归地构造左子树,并连接到根节点
            # 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
            root.left = myBuildTree(preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1)
            # 递归地构造右子树,并连接到根节点
            # 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
            root.right = myBuildTree(preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right)
            return root
        
        n = len(preorder)
        # 构造哈希映射,帮助我们快速定位根节点
        index = {element: i for i, element in enumerate(inorder)}
        return myBuildTree(0, n - 1, 0, n - 1)

尝试写了下,还是不行

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder or not inorder:
            return
        n = len(preorder)
        index = {element: ind for ind, element in enumerate(inorder)}
        

        def mybuildTree(preorder, preleft, preright, inleft, inright):
            if preleft > preright or inleft > inright:
                return 
            root = TreeNode(val = preorder[preleft]) 
            pivot_index = index[preorder[preleft]]
            root.left = mybuildTree(preorder, preleft + 1, pivot_index - inleft + preleft + 1, inleft, pivot_index)
            root.right = mybuildTree(preorder, pivot_index - inleft + preorder + 1, preright + 1, pivot_index + 1, inright + 1)
            return root
        return mybuildTree(preorder, 0, n - 1, 0, n - 1)

先跳过吧,回头再来补

第二遍过来写了,能写出来了,但是还是看着答案写的:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]):
        def buildT(pre_left, pre_right, in_left, in_right):
            if pre_left > pre_right:
                return 
            root_val = preorder[pre_left]
            root = TreeNode(root_val)
            in_index = index[root_val]
            size = in_index - in_left
            root.left = buildT(pre_left + 1, pre_left + size, in_left, in_index - 1)
            root.right = buildT(pre_left + size + 1, pre_right, in_index + 1, in_right)
            return root

        n = len(preorder)
        index = {ele:ind for ind, ele in enumerate(inorder)}
        return buildT(0, n - 1, 0, n - 1)

在这里插入图片描述

114. 二叉树展开为链表

在这里插入图片描述
在这里插入图片描述
能把列表通过dfs输出,但是不会构建。。。。我感觉自己是个弱智

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        res = deque()
        def dfs(root, res):
            if not root:
                return 
            res.append(root.val)
            if root.left:
                dfs(root.left, res)
            if root.right:
                dfs(root.right, res)
        dfs(root, res)
        dummy = root1 = TreeNode(res.popleft())
        while res:
            root1.right = TreeNode(res.popleft())
            root1 = root1.right
        return dummy
        

下面是官方答案:他用的prev和curr,我不知道怎么做的。我知道我为什么错了,这道题需要原地改变,而不是新建一个树。所以没有return,他就是看root。下面他加入list是root节点,而不是节点的值。
在这里插入图片描述

class Solution:
    def flatten(self, root: TreeNode) -> None:
        preorderList = list()

        def preorderTraversal(root: TreeNode):
            if root:
                preorderList.append(root)
                preorderTraversal(root.left)
                preorderTraversal(root.right)
        
        preorderTraversal(root)
        size = len(preorderList)
        for i in range(1, size):
            prev, curr = preorderList[i - 1], preorderList[i]
            prev.left = None
            prev.right = curr

下面是我改的

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

class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        res = []
        def dfs(root):
            if not root:
                return 
            res.append(root)
            if root.left:
                dfs(root.left)
            if root.right:
                dfs(root.right)
        dfs(root)
        for i in range(1, len(res)):
            pre, cur = res[i - 1], res[i]
            pre.left = None
            pre.right = cur

第二遍:先用dfs遍历,然后把root都加入到列表中,然后在重新把root树更改。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def flatten(self, root: TreeNode):
        li = []
        def dfs(root):
            if not root:
                return
            li.append(root)
            if root.left: dfs(root.left)
            if root.right: dfs(root.right)
        dfs(root)
        for i in range(len(li) - 1):
            root = li[i]
            root.left = None
            root.right = li[i + 1]

进阶的版本需要在原树上更改,这就需要用到递归了。
在这里插入图片描述

class Solution:
    def flatten(self, root: TreeNode) -> None:
        if not root:
            return
        
        stack = [root]
        prev = None
        
        while stack:
            curr = stack.pop()
            if prev:
                prev.left = None
                prev.right = curr
            left, right = curr.left, curr.right
            if right:
                stack.append(right)
            if left:
                stack.append(left)
            prev = curr

在这里插入图片描述

121. 买卖股票的最佳时机

在这里插入图片描述
通过了,但是我感觉我的思路不是按照老师讲的dp的思路写的。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices or len(prices) == 0:
            return 0
        n = len(prices)
        dp = [0] * (n + 1)
        min_val = float('inf')
        for i in range(n):
            min_val = min(min_val, prices[i])
            dp[i] = prices[i] - min_val
        return max(dp)

这个答案的思路和我想的一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        if n == 0: return 0 # 边界条件
        dp = [0] * n
        minprice = prices[0] 

        for i in range(1, n):
            minprice = min(minprice, prices[i])
            dp[i] = max(dp[i - 1], prices[i] - minprice)

        return dp[-1]

http://www.niftyadmin.cn/n/1207618.html

相关文章

二维码显示要求

1:鼠标挪到二维码时能正常显示 2:显示的速度 3:抽象出一个方法转载于:https://www.cnblogs.com/lxq0924/p/5082619.html

Leetcode 算法面试冲刺 热题 HOT 100 刷题(124 128 136 139 141)(六十一)

文章目录124. 二叉树中的最大路径和128. 最长连续序列136. 只出现一次的数字139. 单词拆分141. 环形链表124. 二叉树中的最大路径和 困难题&#xff0c;我先跳过。 128. 最长连续序列 不会。 class Solution {public int longestConsecutive(int[] nums) {Set<Integer&…

自定义颜色清屏

openGL默认情况下清屏将RGB分量清零&#xff0c;所以屏幕变成黑色。采用如下的函数&#xff1a;glClear(GL_COLOR_BUFFER_BIT)。当然可以自定义清屏的颜色&#xff0c;采用如下的函数&#xff1a;glClearColor(1.0f, 0.0f, 0.0f, 0.0f)&#xff0c; 将屏幕渲染成红色void myDis…

目标检测 Chapter1 传统目标检测方法

文章目录目标检测问题定义介绍目标检测和图像分类、图像分割的区别目标检测问题方法传统目标检测深度学习目标检测传统 Vs 深度学习传统目标检测综述Viola-JonesHOGSVMDPMNMS 非极大值抑制目标检测问题定义 介绍 目标种类与数量问题&#xff1a;种类不同。种类越多&#xff0c…

maven ClassNotFoundException: org.springframework.web.context.ContextLoader

信息: Starting Servlet Engine: Apache Tomcat/6.0.32 2012-3-31 9:39:40 org.apache.catalina.core.StandardContext listenerStart 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFound…

目标检测 CenterNet 模型原理与论文精读(一)

文章目录简介Backbone如何制作数据集的Ground TruthCenter的设置如何计算Loss总结简介 Faster R-CNN和RetinaNet都是基于Anchor机制的。 Faster R-CNN是需要RPN进行预选框的筛选&#xff0c;300个框左右。 RetinaNet是one-stage的方法&#xff0c;没有RPN&#xff0c;直接暴力枚…

Leetcode 算法面试冲刺 热题 HOT 100 刷题(142 146 148 152 155)(六十二)

文章目录142. 环形链表 II146. LRU 缓存148. 排序链表152. 乘积最大子数组155. 最小栈142. 环形链表 II 想了一个集合的方法&#xff0c;比较简单。 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # s…

C++ 基础与深度分析 Chapter0 C++基础

文章目录什么是C与底层硬件紧密结合对象生命周期的精准控制Zero-Overhead AbstrctionC的开发环境与相关工具C的编译/链接模型总结什么是C C是C语言的一种扩展&#xff0c;更关注性能。与底层硬件紧密结合&#xff0c;这就是自动驾驶和机器人为什么要会C。 C引入了大量的特性&am…