1. 程式人生 > >golang 求陣列最大連續子陣列

golang 求陣列最大連續子陣列

直接上程式碼了

//x.1 求數組裡最長連續字陣列 O(n)內
func MaxSerialArr(arr []int) []int {
    //總長
    var max = 0
    //集合點
    var jointIndex = -1
    //結果集
    var rs = make([]int, 0, len(arr))
    //集合點左邊(比集合點小的部分長度)
    leftLen:= 0
    for i, v := range arr {
        lengthTmp,leftLenTmp,_:= Depth(arr,v)
        if lengthTmp > max {
            max = lengthTmp
            jointIndex = i
            leftLen = leftLenTmp
        }
    }
    min := arr[jointIndex] - leftLen
    for
j:=0;j<max;j++{ rs = append(rs,min+j) } return rs } //總深度,左深度,右深度 func Depth(arr []int, elem int) (int,int,int) { return 1 + containLeftLen(arr, elem-1) + containRightLen(arr, elem+1),containLeftLen(arr,elem-1), containRightLen(arr,elem+1) } //arr是否包含elem func contain(arr []int, elem int
) bool { for _, v := range arr { if v == elem { return true } } return false } //左深度 func containLeftLen(arr []int, elem int) int { if contain(arr, elem) { return containLeftLen(arr, elem-1) } return 0 } //右深度 func containRightLen(arr []int, elem int
) int { if contain(arr, elem) { return containRightLen(arr, elem+1) + 1 } return 0 }

測試:

func main() {
    var arr = []int{
        1,5,9,8,12,100,2,7,3,3,1,94,96,93,98,99,97,
    }
    fmt.Println(MaxSerialArr(arr))
}

結果:
···
[96 97 98 99 100]
···