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