左右划分最大值距离

左右划分最大值距离

最大的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。


常规解法

算法思路

遍历所有情形,找出最大值距离。
时间复杂度为 O ( N 2 ) O(N^2)


相应代码

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,再遍历求出最大值距离。
时间复杂度为为 O ( N ) O(N) ,空间复杂度为为 O ( N 2 ) O(N^2)


相应代码

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

最优解法

算法思路

求最大值距离时,左边局部最大值和右边局部最大值必有一个是数组最大值
若数组最大值在左边时,则要求右边局部最大值尽可能小,即只包含最右边值——数组的最后一个值
若数组最大值在右边时,则要求左边局部最大值尽可能小,即只包含最左边值——数组的第一个值
时间复杂度为为 O ( N ) O(N) 空间复杂度为为 O ( 1 ) O(1)


相应代码

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)

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

发布了57 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/the_harder_to_love/article/details/104207276