分治
1. 主要思想
分值算法的主要思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的。
2. 分值算法的步骤
- 分:递归的将问题分解为各个子问题(性质相同,相互独立的子问题)
- 治:将这些规模更小的问题逐个击破
- 合:将已解决的子问题逐层合并,最终得出原问题
leetcode 169.多数元素
给定一个大小为n的数组,找到其中的众数,众数是指在数组中出现次数大于 n/2 的元素
def majorityelement(self,nums):
if not nums:
return None
if len(nums) == 1:
return nums[0]
left = self.majorityelement(nums[:len(nums)//2])
right = self.majorityelement(nums[len(nums)//2:])
if left == right:
return left
if nums.count(left) > nums.count(right):
return left
else:
return right
leetcode53.最大子序和
给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组中最少包含一个元素),返回其最大和。
def maxsubarray(nums):# 传入参数
if nums == []: # 如果列表为空,终止
return
if len(nums) == 1:
return nums[0]
cut = len(nums) // 2 # 设置中点
leftsunm = maxsubarray(nums[:cut]) # 分治:找到左子序列的最大和
rightsum = maxsubarray(nums[cut:]) # 找到右子序列的最大和
leftmidsum = 0
maxl = 0
rightmidsum = 0
for i in range(cut-1,-1,-1): #找到左子序列与右子序列之间的字列表最大和
leftmidmsum += sum[i]
maxl = max(leftmidsum,maxl)
for i in range(cut+1,len(nums),-1):
rightmidsum += sum[i]
maxr = max(rightmidsum,maxr)
return (max(leftsum,maxl+num[cut]+maxr,rightsum)) #返回三个可能最大的值
leetcode50. pow(x,n)
实现pow(x,n),计算x的n次幂函数
def mypow(self,x,n):
if n < 0:
x = 1/x
n = -n
if n == 0:
return 1
if n % 2 == 1:
p = x * self.mypow(x,n-1)
return p
return self.mypow(x*x,n/2)