计算x的n次幂
- 思路:采用递归的思想,对于一个数来说,其n次幂等价于本身*其n-1次幂,将此作为递归关系,同时基线条件为n=时,返回1
- 注意:n可以为负数,当n为负数时,需提前将n转为正数,底变为倒数
- def pow(x, n):
if n < 0:
n = -n
x = 1/x
if n == 0:
return 1
return x*pow(x, n-1)
最大子序和
-
思路:采用分治的思想,将其看作三部分的最大值,即左边部分最大子序和,右边部分最大子序和,从中间开始向两边扩展的最大子序和。求左右两部分的最大子序和又可看做若干个子问题,采用递归算法求解。中间部分则当加完某一元素后值变小时停止扩展。
-
def max_sum_arry(nums):
if len(nums) == 1:
return nums[0]
else:
max_left = max_sum_arry(nums[:len(nums)//2])
max_right = max_sum_arry(nums[len(nums)//2:])
max_l = nums[len(nums)//2-1]
temp = 0
for i in range(len(nums)//2-1,-1,-1):
temp += nums[i]
max_l = max(temp, max_l)
max_r = nums[len(nums)//2]
temp = 0
for i in range(len(nums)//2,len(nums)):
temp += nums[i]
max_r = max(temp, max_r)
return max(max_left,max_right,max_l+max_r)多数元素
- 思路:既然存在一个元素出现次数大于总个数的1/2,那么假设相同值为一颜色,不同值为不同颜色,当相同颜色相遇时累加,不同颜色相遇时抵消,最终剩余部分颜色一定全部相同(至少一个)
- def find_elements(arry):
index = 0
cnt = 0
start = arry[index]
i = 0
for i in range(len(arry)):
cnt += 1 if arry[i] == start else -1
if cnt ==0:
index = i+1
start = arry[index]
return start