golang 求陣列最大連續子陣列
阿新 • • 發佈:2018-11-10
直接上程式碼了
//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]
···