поиск пиков в массиве с Golang - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь найти вершину массива. Я уже видел несколько руководств по решению проблемы, но ни один из них не использует 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...