golang 求数组最大连续子数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fwhezfwhez/article/details/81874118

直接上代码了

//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]
···

猜你喜欢

转载自blog.csdn.net/fwhezfwhez/article/details/81874118