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

参考资料:
ACM 选手图解 LeetCode 169 多数元素

posted @   YTT77  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示