leetcode(27)分治系列题目
分治法:分而治之 与递归相伴随
169. 多数元素
(1) 划分
每次将数组拆分为左右两个区间,直至拆成最小规模的问题,每个区间只有一个数。
(2) 求解
递归的求解划分之后的子问题。
在最小的区间里,每个区间只有一个数,那该区间的众数该数。
(3) 合并
一步步的向上合并,合并过程中分为两种情况:
- 左右两个区间的众数相同,那直接返回这个众数。
- 左右两个区间的众数不同,这时就将两个区间合并,在合并后的区间种计算出这两个众数出现的次数,将数值大的众数返回。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
def getMajor(left, right):
if left == right:
return nums[left]
# 递归划分左右区间
mid = (left + right) // 2
leftMajor = getMajor(left,mid)
rightMajor = getMajor(mid + 1, right)
# 如果左边众数 = 右边的众数
if leftMajor == rightMajor:
return leftMajor
else:
# 合并区间找众数
leftCount = sum(1 for i in range(left, right + 1) if nums[i] == leftMajor)
rightCount = sum(1 for i in range(left, right + 1) if nums[i] == rightMajor)
return leftMajor if leftCount > rightCount else rightMajor
return getMajor(0, len(nums) - 1)
241. 为运算表达式设计优先级
对于一个形如 x op y(op 为运算符,x 和 y 为数) 的算式而言,它的结果组合取决于 x 和 y 的结果组合数,而 x 和 y 各自又可以写成形如 x op y 的算式。
因此,该问题的子问题就是 x op y 中的 x 和 y:以运算符分隔的左右两侧算式解。
分治算法三步走:
分解:按运算符分成左右两部分,分别求解
解决:实现一个递归函数,输入算式,返回算式解
合并:根据运算符合并左右两部分的解,得出最终解
class Solution:
def diffWaysToCompute(self, expression: str) -> List[int]:
res = []
# 如果只有数字,直接返回
if expression.isdigit():
return [int(expression)] # 注意返回列表
for i, e in enumerate(expression):
if e in ['+','-','*']: # 注意写成列表形式
# 1.分解:遇到运算符,计算左右两侧的结果集
# 2.解决:diffWaysToCompute 递归函数求出子问题的解
left = self.diffWaysToCompute(expression[:i])
right = self.diffWaysToCompute(expression[i + 1:])
# 3.合并:根据运算符合并子问题的解
for l in left:
for r in right:
if e == '+':
res.append(l + r)
elif e == '-':
res.append(l - r)
else:
res.append(l * r)
return res
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示