python untitled_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]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值