左右划分最大值距离
最大的leftMax与rightMax之差的绝对值
【题目】
给定一个长度为N(N>1)的整型数组arr,可以划分成左右两个部分,
左部分为 arr[0…K],右部分为arr[K+1…N-1],K可以取值的范围是[0,N-2]。
求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值中,最大是多少?
例如:[2,7,3,1,1],
当左部分为[2,7],右部分为[3,1,1]时,左部分中的最大值减去右部分最大值的绝对值为4。
当左部分为[2,7,3],右部分为[1,1]时,左部分中的最大值减去右部分最大值的绝对值为6。
还有很多划分方案,但最终返回6。
常规解法
算法思路
遍历所有情形,找出最大值距离。
时间复杂度为
相应代码
def max_partition_distance1(arr):
num = len(arr)
distance = 0
for i in range(0, num - 1):
left_max = arr[0]
for j in range(1, i+1):
if arr[j] > left_max:
left_max = arr[j]
right_max = arr[i+1]
for j in range(i+2, num-1):
if arr[j] > right_max:
right_max = arr[j]
if abs(left_max - right_max) > distance:
distance = abs(left_max - right_max)
return distance
进阶解法
算法思路
预数组处理,求从最左边起数组局部最大值数组lArr,从最右边起数组局部最大值数组rArr,再遍历求出最大值距离。
时间复杂度为为
,空间复杂度为为
相应代码
def max_partition_distance2(arr):
num = len(arr)
lArr = [0 for i in range(num)]
rArr = [0 for i in range(num)]
# 左边起局部最大值lArr
lArr[0] = arr[0]
for i in range(1, num):
if arr[i] > lArr[i - 1]:
lArr[i] = arr[i]
else:
lArr[i] = lArr[i - 1]
# 右边起局部最大值rArr
rArr[num - 1] = arr[num - 1]
for i in range(num - 2, -1, -1):
if arr[i] > rArr[i + 1]:
rArr[i] = arr[i]
else:
rArr[i] = rArr[i + 1]
# 遍历两个局部最大值数组,求出最大值距离
distance = 0
for i in range(0, num - 1):
if abs(lArr[i] - rArr[i + 1]) > distance:
distance = abs(lArr[i] - rArr[i + 1])
return distance
最优解法
算法思路
求最大值距离时,左边局部最大值和右边局部最大值必有一个是数组最大值
若数组最大值在左边时,则要求右边局部最大值尽可能小,即只包含最右边值——数组的最后一个值
若数组最大值在右边时,则要求左边局部最大值尽可能小,即只包含最左边值——数组的第一个值
时间复杂度为为
,空间复杂度为为
相应代码
def max_partition_distance3(arr):
num = len(arr)
maximum = arr[0]
for i in range(1, num):
if arr[i] > maximum:
maximum = arr[i]
# 数组最大值在左边,最小值在最右边
if maximum - arr[num - 1] > -(arr[0] - maximum):
return maximum - arr[num - 1]
# 数组最大值在右边,最小值在最左边
else:
return -(arr[0] - maximum)
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!