Untitled

task01 分治法

1.50. Pow(x, n): https://leetcode-cn.com/problems/powx-n/
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n == 0:
            return 1
        elif n == 1:
            return x
        elif n == 2:
            return x * x
        elif n < 0:
            return 1 / (self.myPow(x,-n))
        elif n % 2 == 0:
            half = self.myPow(x,n/2)
            return half * half
        else:
            half = self.myPow(x,n // 2)
            return half * half * x

利用递归实现分治计算n次幂,一开始直接return self.myPow(x,n/2)在测试时2.00000,-2147483648的测试数据报错Line 12: OverflowError: (34, ‘Numerical result out of range’),然后将代码拆分成两行就好了

2.53. 最大子序和:https://leetcode-cn.com/problems/maximum-subarray/
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        def findMax(nums):
            l = len(nums)
            if l == 1:
                return nums[0],nums[0],nums[0],nums[0]
            else:
                l1,l2,l3,l4 = findMax(nums[:l//2])
                r1,r2,r3,r4 = findMax(nums[l//2:])
                left = max(l1,l4+r1)
                right = max(r3,r4+l3)
                mid = max([l2,r2,l3+r1,left,right])
                return left,mid,right,l4+r4
        l,m,r,al = findMax(nums)
        return max([l,m,r])

利用递归计算,每次将数组分为左右两部分,每部分计算从左端开始最大连续子序列和l,从右端开始最大连续子序列和r,序列最大连续子序列和m,以及数组总和s。之后将左右两部分结果合并,作为自己的结果,l为max(l1,s1+l2),r为max(r2,s2+l2),m为max(l,r,m1,m2,r1+l2),s为s1+s2

3.169. 多数元素:https://leetcode-cn.com/problems/majority-element/
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        def count_most(nums):
            if len(nums) == 1:
                return [nums[0],1]
            else:
                l = len(nums)
                l1 = count_most(nums[:l//2])
                l2 = count_most(nums[l//2:])
                if l1[0] == l2[0]:
                    return [l1[0],l1[1]+l2[1]]
                else:
                    n1 = sum([1 for i in nums[:l//2] if i == l1[0]])
                    n2 = sum([1 for i in nums[l//2:] if i == l2[0]])
                    if n1>=n2:
                        return [l1[0],n1]
                    else:
                        return [l2[0],n2]
        return count_most(nums)[0]

分治法不是最好的策略,但可以通过这道题熟悉分治法的使用,每一部分计算众数及次数,当左右两部分众数一样,则返回这个数以及两部分次数之和,当左右众数不一样,统计合并后两个数次数并比较,选出新的众数及频数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值