2021-03-10:配列にN個のポイントがあり、シーケンス番号0のポイントが開始ポイントであり、シーケンス番号N-1のポイントが終了ポイントです。

2021-03-10:配列内にN個のポイントがあり、シーケンス番号0のポイントが開始位置であり、シーケンス番号N-1のポイントが終了位置です。次に、ポイント0からポイントN-1まで順番に歩く必要があります。しかし、ポイント0とポイントN-1に加えて、残りのN-2位置からポイントを選択し、このポイントを直接無視して、少なくとも始点から終点までの距離を尋ねることができますか?

フーゲの答え2021-03-10:

配列[1,4、-1,3]、シーケンス番号1を無視すると、配列は[1、-1,3]になり、距離はabs(-2)+ 4 = 6になり、シーケンス番号2を無視すると、配列は[1、4,3]になり、距離は3 + 1 = 4になります。
N-2座標から点を選択し、この点を直接無視します。ポイントを直接無視すると、ノードの前後のノード間の距離に直接影響するだけです。この影響を受ける距離を一時的に最適化距離と名付け、すべてのノードを順番に3つのノードのセットに形成します。このように、ループを通過するだけで結果を得ることができます。
ここに画像の説明を挿入します
コードはgolangで記述されており、コードは次のとおりです。

package main

import "fmt"

func main() {
    arr := []int{1, 4, -1, 3}
    fmt.Println(shortDistance(arr))
}
func shortDistance(arr []int) int {
    arrLen := len(arr)
    if arrLen <= 1 {
        return 0
    }
    if arrLen <= 3 {
        return abs(arr[arrLen-1] - arr[0])
    }
    i1 := arr[1] - arr[0]
    i2 := 0
    maxval := 0    //最大优化距离
    ret := abs(i1) //所有相邻两边距离之和

    for i := 1; i < arrLen-1; i++ {
        i2 = arr[i+1] - arr[i]

        maxval = getMax(maxval, abs(i2)+abs(i1)-abs(i2+i1))

        i1 = i2
        ret += abs(i1)
    }

    return ret - maxval
}
func abs(a int) int {
    if a < 0 {
        return -a
    } else {
        return a
    }
}
func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

実行結果は以下のとおりです。
ここに画像の説明を挿入します


コメント

おすすめ

転載: blog.51cto.com/14891145/2655133