定义递归函数求取指定区间的最大值与次大值
-
形参分别是:数组,区间左下标,区间右下标
-
返回值:(最大值, 次大值)
def solve(a, low, high):
max1 = None
max2 = None
return (max1, max2)
一、有三种情况
-
情况1:区间中只有一个值
-
最大值为该值
max1 = a[low]
-
次大值为无穷小
max2 = -inf
-
-
情况2:区间中只有两个值
-
最大值为两数中的较大数
max1 = max(a[low], a[high])
-
次大值为另一个数
max2 = min(a[low], a[high])
-
-
情况3:区间中有多个值
-
计算区间中位数 mid
mid = int((low + high) / 2)
-
递归求取左区间([low, mid])最大值及次打值
lmax1, lmax2 = solve(a, low, mid)
-
递归求取右区间([mid + 1, high])最大值及次大值
rmax1, rmax2 = solve(a, mid + 1, high)
-
判断四个数中的最大值及次大值
-
左区间最大值 > 右区间最大值
-
最大值:必为左区间最大值
max1 = lmax1
-
次大值:max(左区间次大值, 右区间最大值)
max2 = max(lmax2, rmax1)
-
-
左区间最大值 < 右区间最大值
-
最大值: 必为右区间最大值
max1 = rmax1
-
次大值: max(右区间次大值, 左区间最大值)
max2 = max(rmax2, lmax1)
-
-
-
二、完整分治函数
def solve(a, low, high):
low = int(low)
high = int(high)
if low == high:
max1 = a[low]
max2 = -999999999
elif low == high - 1:
max1 = max(a[low], a[high])
max2 = min(a[low], a[high])
else:
mid = int((low + high) / 2)
lmax1, lmax2 = solve(a, low, mid)
rmax1, rmax2 = solve(a, mid + 1, high)
if lmax1 > rmax1:
max1 = lmax1
max2 = max(lmax2, rmax1)
else:
max1 = rmax1
max2 = max(rmax2, lmax1)
return (max1, max2)
三、主函数
def main():
a = [2, 5, 1, 7, 10, 6, 9, 4, 3, 8]
max1, max2 = solve(a, 0, 9)
print(f'最大值 {max1}, 次大值 {max2}.')
四、调用主函数查看运行结果
main()
最大值 10, 次大值 9.
觉得本文不错,“点赞、收藏、关注” 是对作者最大的鼓励!!!