Я пытаюсь найти вершину массива. Я уже видел несколько руководств по решению проблемы, но ни один из них не использует golang. Моя проблема в том, что в этом массиве есть плато со значениями 8, 8: [13, 9, -2, -5, 8, 8, 14, -2, -3] возвращается неправильный пик. Ожидаемый пик должен быть 14.
Я начал с этого алгоритма:
type PosPeaks struct {
Pos []int
Peaks []int
}
func PickPeaks(array []int) PosPeaks {
var p PosPeaks
if len(array) == 0 {
return p
}
// build a difference array, that indicates the change between the
// ith element and the ith+1 element. +1 if positive change, 0 if
// no change and -1 if negative change
diff := []int{}
for i := 0; i < len(array)-1; i++ {
if array[i] < array[i+1] {
diff = append(diff, 1)
} else if array[i] == array[i+1] {
diff = append(diff, 0)
} else {
diff = append(diff, -1)
}
}
// Now walk through the difference array, looking at the
// changes
for i := 0; i < len(array)-2; i++ {
// if it goes uphill and then down, this is a peak to record
if diff[i] == 1 && diff[i+1] == -1 {
p.Pos = append(p.Pos, i+1)
p.Peaks = append(p.Peaks, array[i+1])
}
// If it goes uphill, then plateaus, then look out further to
// see if it ever goes downhill. If so, call this a peak.
if diff[i] == 1 && diff[i+1] == 0 {
for j := i + 1; j < len(array)-1; j++ {
if diff[j] == -1 {
p.Pos = append(p.Pos, i+1)
p.Peaks = append(p.Peaks, array[i+1])
}
}
}
}
return p
}