2021-03-10:一個數組上共有 N 個點,序號爲0的點是起點位置,序號爲N-1 的點是終點位置。如今須要依次的從 0 號點走到 N-1 號點。可是除了 0 號點和 N-1 號點,他能夠在其他的 N-2 個位置中選出一個點,並直接將這個點忽略掉,問從起點到終點至少走多少距離? golang
福哥答案2021-03-10:數組
數組[1,4,-1,3],忽略序號1,數組變成[1,-1,3],距離是abs(-2)+4=6;忽略序號2,數組變成[1,4,3],距離是3+1=4。
N-2 個座標中選出一個點,並直接將這個點忽略掉。直接忽略一個點只會直接影響到,這個節點先後節點的距離。這個 影響的距離咱們暫且命名爲優化距離,將全部節點按順序組成三個節點的集合,經過這種方式只須要經過一次循環便能獲得結果。
代碼用golang編寫,代碼以下:ide
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 } }
執行結果以下:優化
評論code