刷力扣学习分治
分治是一种很常见的思路,把一个大问题分解成一个一个小问题,这在很多算法里都有体现,循环和递归都能实现这种算法,可以通过分治来学习怎么用循环和递归实现各种算法
#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)