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
}
}
実行結果は以下のとおりです。