50. Pow(x, n)
递归:
终止条件:x0 = 1,n=1
递归主体:xn = x**(n//2) * x**(n//2) 在N为偶数时;奇数时需要单独拎出来一个x1,使得也能两个一半相乘
分解问题:每个xn都可以表示为两个x**n的一半
class Solution:
def myPow(self, x: float, n: int) -> float:
# 递归函数
def fast_pow(x,n):
if n == 0:
return 1
half = fast_pow(x, n//2)
# 偶数
if n % 2 == 0:
return half * half
# 奇数
else:
return half * half * x
# 区分n的正负
if n < 0:
x = 1/x
n = -n
# 正常计算
return fast_pow(x,n)
169. 多数元素
示例代码:
def majorityElement(nums):
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
53. 最大子数组和
一种是用辅助数组,走动态规划;另一种是迭代,因为当前最大和取决于上一个的。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 辅助数组
dp = [0] * len(nums)
dp[0] = nums[0]
for i in range(1, len(nums)):
if dp[i-1] >= 0:
dp[i] = dp[i-1] + nums[i]
else:
dp[i] = nums[i]
return max(dp)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 辅助数组
temp_max = global_max = nums[0]
for num in nums[1:]:
temp_max = max(num, temp_max+num)
global_max = max(global_max, temp_max)
return global_max
0932. 漂亮数组
递归和分治算法。
[1]是一个最小的漂亮数组。
需要对其进行转换,等式 A[k] * 2 = A[i] + A[j] 的左侧是一个偶数,右侧的两个元素分别来自两个部分。要想等式恒不成立,一个简单的办法就是让 left 部分的数都是奇数,right 部分的数都是偶数。
所以对左边进行奇数序列映射,右边进行偶数序列映射。
class Solution:
def beautifulArray(self, n: int) -> List[int]:
# 递归终止:1就是最基本的漂亮数组
if n == 1: return [1]
# 左边的
left = self.beautifulArray((n+1)//2)
# 右边的
right = self.beautifulArray(n//2)
# 奇数序列,偶数序列
return [2*x-1 for x in left] + [2*x for x in right]
241. 为运算表达式设计优先级
23. 合并 K 个升序链表
困难题根本不想做