题目练习
Pow(x, n)
class Solution:
def myPow(self, x: float, n: int) -> float:
return self.helper(x, n) if n > 0 else 1 / self.helper(x, -n)
def helper(self, x, n):
if x == 0:
return 0
if n == 0:
return 1
y = self.helper(x, n // 2)
return y * y if n % 2 == 0 else y * y * x
最大子序和
动态规划解法:时间复杂度 O(N),空间复杂度 O(1)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
if len(nums) == 1:
return nums[0]
for i in range(1, len(nums)):
if nums[i - 1] > 0:
nums[i] += nums[i - 1]
return max(nums)
分治法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
if len(nums) == 1:
return nums[0]
# 求左半边的最大值
max_left = self.maxSubArray(nums[: len(nums) // 2])
# 求右半边的最大值
max_right = self.maxSubArray(nums[len(nums) // 2:])
# 求跨越中间的最大值
# 求从左半边的右端点向左数的最大和
temp = 0
max_l = nums[len(nums) // 2 - 1]
for i in range(len(nums) // 2 - 1, -1, -1):
temp = nums[i] + temp
max_l = max(max_l, temp)
# 求从右半边的左端点向右数的最大和
temp = 0
max_r = nums[len(nums) // 2]
for i in range(len(nums) // 2, len(nums)):
temp += nums[i]
max_r = max(temp, max_r)
return max(max_r + max_l, max_left, max_right)
多数元素
- 思路一:哈希表 时间复杂度O(n);
- 思路二:排序,n / 2位置一定是多数元素 时间复杂度O(nlogn);
- 思路三:随机抽取一个数。该数有1/2的可能性是多数元素。抽取的数字为多数元素的数学期望为2,即O(1),但确定该数字是否为多数元素需要逐个比较,因此总的时间复杂度为O(n);
- 思路四:分治法
class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int """ # 【不断切分的终止条件】 if not nums: return None if len(nums) == 1: return nums[0] # 【准备数据,并将大问题拆分为小问题】 left = self.majorityElement(nums[:len(nums)//2]) right = self.majorityElement(nums[len(nums)//2:]) # 【处理子问题,得到子结果】 # 【对子结果进行合并 得到最终结果】 if left == right: return left if nums.count(left) > nums.count(right): return left else: return right