ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode -- 9+102+104+105

2022-09-17 01:30:57  阅读:525  来源: 互联网

标签:node return -- self stack 102 root leetcode append


  1. 回文数
easy
# 两种写法 
# 时间复杂度低 且考虑特殊情况
class Solution:
    def isPalindrome(self, x: int) -> bool:
        # first solution follow the answer
        if x < 0 or ( x % 10 == 0 and x != 0 ):
            return False
         
        revertedNumber = 0
        while x > revertedNumber:
            revertedNumber = revertedNumber * 10 + x % 10
            x //= 10
        return x == revertedNumber or x == revertedNumber // 10

# 直接暴力结束 且不用考虑情况
def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]
  1. 二叉树层序遍历
medium
# 1 钻入死胡同
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root == None: return []
        rst, stack = [] , []
        stack.append(root)
        stack_1 = []
        while stack:
            ele = []
            while stack:
                cur = stack.pop()
                if isinstance(cur, TreeNode):
                    stack_1.extend([cur.right, cur.left])
                else:
                    stack.pop()
                    continue
                ele.append(cur.val)
            if ele: rst.append(ele)
            ele = []
            while stack_1:
                cur = stack_1.pop()
                if isinstance(cur, TreeNode):
                    stack.extend([cur.right, cur.left])
                else:
                    stack_1.pop()
                    continue
                ele.append(cur.val)
            if ele: rst.append(ele)
        return rst

# 2 清醒 
# 欣赏一个老哥子的代码 时空复杂度均为O(n)
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        # 创建 stack 完成 root 加载 if root == None 则加载 []
        stack = [root] if root else []
        while stack:
            # 循环内部创建tmp栈
            tmp_stack = []
            # 使用推导式直接append所有val节省打字实践
            ans.append([i.val for i in stack])
            # 顺序读 伪栈 直接 append (node.left) (node.right)
            for node in stack:
                if node.left:
                    tmp_stack.append(node.left)
                if node.right:
                    tmp_stack.append(node.right)
            # 每次完成 首先更新ans 然后更新外部栈
            stack = tmp_stack
        return ans
  1. 二叉树的最大深度
easy
# 这不就层序遍历...
# 在层序遍历的代码中加入maxSize 这样可以直接返回最大深度
# 使用 bfs
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        maxSize = 0
        stack = [root] if root else []
        while stack:
            tmp_stack = []
            for node in stack:
                if node.left:
                    tmp_stack.append(node.left)
                if node.right:
                    tmp_stack.append(node.right)
            stack = tmp_stack
            maxSize += 1
        return maxSize
# 非常 easy


# 使用 dfs
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None: return 0
        else:
            return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1
# 虽然很快 但是递归需要使用栈空间 
# 时间复杂度为O(n) 空间复杂度为O(height)依据树的高度而定
  1. 从前序列与中序遍历序列中构造二叉树
medium
# 思路: preorder开头卡一刀 拿root
# inroder中间卡一刀 拿两边的inorder 用两边的inorder来分割preorder的后面部分
# preorder再卡一刀 拆成两个sub-inorder 的 sub-preorder 做成递归形态 返回

# 官方题解讲的太清楚 导致我一点都不想看
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        # judge 
        if preorder == [] and inorder == []:
            return
        root = TreeNode(preorder[0])
        i = inorder.index(preorder[0])
        root.left = self.buildTree(preorder[1:i+1],inorder[:i])
        root.right = self.buildTree(preorder[i+1:],inorder[i+1:])
        return root
# 递归栈导致内存消耗过大
# 明天使用stack遍历序列重写


评价:明天有空再看看官方题解 这个做法确实挺好

标签:node,return,--,self,stack,102,root,leetcode,append
来源: https://www.cnblogs.com/DocGu/p/16701721.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有