最大距離を分割について

最大距離を分割について

leftMaxの最大とrightMaxとの差の絶対値

[タイトル]

N(N> 1)の長さは、整数配列ARRで与えられ、それは、2つの左右の部分に分割されてもよい、
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を返しました。


従来のソリューション

アルゴリズムの考え方

すべてのシナリオを通して、最大距離を見つけます。
時間の複雑さがあります ザ・ 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を、その後、最大横断距離を見つけます。
時間の複雑さがにあります ザ・ N O(N) 、空間的複雑です ザ・ 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

最適解

アルゴリズムの考え方

最大値を選択するときに極大と極大の左から右への配列が最大である必要があり
、アレイ左側の最大値が、極大の右側のみを含む、すなわち、できるだけ小さく要求される右端の値を -アレイ最後の値
アレイ場合は右側の最大値、すなわち、できるだけ小さなのみ含まれるように、極大の左側が必要とされる左端の値を -の配列の最初の値
の時間複雑性はです ザ・ N O(N) 空間的複雑です ザ・ 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 ビュー20000 +

おすすめ

転載: blog.csdn.net/the_harder_to_love/article/details/104207276