刷力扣学习分治[leetcode53. 最大子序和][leetcode105. 从前序与中序遍历序列构造二叉树][leetcode108. 将有序数组转换为二叉搜索树]

本文探讨了分治法在算法设计中的应用,通过实例展示了如何利用分治策略解决最大子序和问题,并详细解释了如何运用分治思想来从前序和中序遍历序列构建二叉树,以及将有序数组转换为二叉搜索树的过程。这些例子涵盖了循环和递归两种实现方式,有助于深入理解分治算法。
摘要由CSDN通过智能技术生成

刷力扣学习分治

分治是一种很常见的思路,把一个大问题分解成一个一个小问题,这在很多算法里都有体现,循环和递归都能实现这种算法,可以通过分治来学习怎么用循环和递归实现各种算法

#53.最大子序和
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        S = 0
        maxS = nums[0]
        for i in nums:
            if S < 0:
                S = i
            else:
                S = i + S
            maxS = max(S,maxS)
        return maxS
#105. 从前序与中序遍历序列构造二叉树
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def dfs (a1,a2,b1,b2):
            inter = 0
            if a1-a2+b2-b1:
                print('???')
            if a1 > a2 or b1 > b2:
                return None
            me  = TreeNode(preorder[a1])
            if a1 == a2:
                return me
            for i in range(b1,b2+1):
                if preorder[a1] == inorder[i]:
                    inter = i
                    break
            print(inter)
            me.left = dfs(a1+1,inter-b1+a1,b1,inter-1)
            me.right = dfs(a1+1+inter-b1,a2,inter+1,b2)
            return me
        return dfs(0,len(preorder)-1,0,len(inorder)-1)
#108. 将有序数组转换为二叉搜索树
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        def foo (a,b):
            if a > b:
                return None
            mid = (a+b)//2
            t = TreeNode(nums[mid])
            if a <b:
                t.left = foo(a,mid-1)
                t.right = foo(mid+1,b)
            return t
        
        return foo(0,len(nums)-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值