LeetCode打卡Task11-分治篇

一、知识点

了解归并排序递归的思想

二、例题

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 buildBST(self,nums,left,right):
        if left>right:
            return None
        mid=left+(right-left)//2
        root=TreeNode(nums[mid])
        root.left=self.buildBST(nums,left,mid-1)
        root.right=self.buildBST(nums,mid+1,right)
        return root
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        return self.buildBST(nums,0,len(nums)-1)

2.从中序与后序遍历序列构造二叉树
在这里插入图片描述

# 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, inorder: List[int], postorder: List[int]) -> TreeNode:
        self.map={j:i for i,j in enumerate(inorder)}
        self.postorder=postorder
        return self.f(0,len(postorder)-1)
    
    def f(self,l,r):
        if l>r:
            return None
        else:
            value=self.postorder.pop()
            index=self.map[value]
            right_node=self.f(index+1,r)
            left_node=self.f(l,index-1)
            return TreeNode(value,left_node,right_node)

3.多数元素
在这里插入图片描述

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        def f(l,r):
            if l==r:
                return nums[l]
            mid=(r+l)//2
            left_res=f(l,mid)
            right_res=f(mid+1,r)
            if left_res==right_res:
                return left_res
            else:
                count_left=sum(1 for i in range(l,r+1) if nums[i]==left_res)
                count_right=sum(1 for i in range(l,r+1) if nums[i]==right_res)
                return left_res if count_left>count_right else right_res
        return f(0,len(nums)-1)

4.最大子数组和
在这里插入图片描述

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # opt=[nums[0]]
        # for i in nums[1:]:
        #     opt.append(max(opt[-1]+i,i))
        # return max(opt)
        if len(nums)==1:
            return nums[0]
        max_left=self.maxSubArray(nums[:len(nums)//2])
        max_right=self.maxSubArray(nums[len(nums)//2:])
        max_l = nums[len(nums)//2-1]
        tmp = 0
        for i in range(len(nums)//2-1,-1,-1):
            tmp += nums[i]
            max_l = max(tmp, max_l)
        max_r = nums[len(nums)//2]
        tmp = 0
        for i in range(len(nums)//2,len(nums)):
            tmp += nums[i]
            max_r = max(tmp, max_r)
        return max(max_right,max_left,max_l+max_r)

5.从前序与中序遍历序列构造二叉树
在这里插入图片描述

# 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:
        self.map={j:i for i,j in enumerate(inorder)}
        self.preorder=preorder
        return self.f(0,len(preorder)-1)
    
    def f(self,l,r):
        if l>r:
            return None
        else:
            value=self.preorder.pop(0)
            index=self.map[value]
            left_node=self.f(l,index-1)
            right_node=self.f(index+1,r)
            return TreeNode(value,left_node,right_node)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值