2021-03-10:一個數組上共有 N 個點,序號爲0的點是起點位置,序號爲N-1 的點是終點位置

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

相關文章
相關標籤/搜索