首页 > 解决方案 > 查找数组的局部最大值及其位置Python的问题

问题描述

所以基本上我正在尝试完成这项任务:https ://www.codewars.com/kata/5279f6fe5ab7f447890006a7

问题:为什么我的函数将位置 11 计为这个特定数组的局部最大值?这是我的代码:

def main():
    arr = [1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3,5,5,4,3]
    maxes = []
    positions = []
    dic = {"pos":positions, "peaks":maxes}
    for i in range(1,len(arr)-1):
        try:
            if arr[i] > arr[i+1] and arr[i] > arr[i-1]:
                maxes.append(arr[i])
                positions.append(i)
            elif arr[i] > arr[i-1] and arr[i] == arr[i+1]:
                for a in range(i+1,len(arr)):
                    if arr[a] > arr[a+1]:
                        maxes.append(arr[i])
                        positions.append(i)
                        break
        except IndexError:
            pass
    print(dic)
main()

我的输出:

{'pos': [2, 7, 11, 14, 20], 'peaks': [5, 6, 3, 5, 5]}

正确的输出:

{'pos': [2, 7, 14, 20], 'peaks': [5, 6, 5, 5]}

标签: pythonarrays

解决方案


当您看到类似“2, 3 ,3, 4,5,3 ...?”的情况时 您保存位置并进一步运行尝试找出:1)最后值较小(这是峰值,保存的值派上用场),2)值较大(不是峰值,高原,保存的值没有用)。

在第二种情况下的特定情况下: elif arr[i] > arr[i-1] and arr[i] == arr[i+1]:您从 second 开始迭代3并仅在 时停止arr[a] > arr[a+1]。在这一刻,您附加旧i值(表示前 3 个):

maxes.append(arr[i]); positions.append(i)

也就是说,您没有考虑到值进一步可能更大并且您需要中断。

该函数的工作示例如下所示:

def main():
    arr = [1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3,5,5,4,3]
    dic = {'pos' : [], 'peaks' : []}

    i, n = 1, len(arr)

    while i < n - 1:
        if arr[i-1] < arr[i] > arr[i+1]:
            dic['peaks'].append(arr[i])
            dic['pos'].append(i)
            i += 1
        else:
            if arr[i-1] < arr[i] and arr[i] == arr[i+1]:
                mem = i
                while i < n -1 and arr[i] == arr[i+1]:
                    i += 1
            
                if i == n - 1:
                    return dic
            
                if arr[i] > arr[i+1]:
                    dic['peaks'].append(arr[mem])
                    dic['pos'].append(mem)
                else:
                    i += 1  
            else:
                i += 1

    return dic

print(main())

推荐阅读