数组 查找相邻的最大值

时间:2021-09-25 10:45:43
有一组数组:String a[]={1,2,3,4,5,6,7,6,,5,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4};

数组为周期性变化,找出其中相邻的两个最大值,即
String a[]={1,2,3,4,5,6, 7,6,,5,4,3,2,1,2,3,4,5, 6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4};

或者
String a[]={1,2,3,4,5,6,7,6,,5,4,3,2,1,2,3,4,5, 6,5,4,3,2,1,2,3,4,5,6,7, 8,7,6,5,4};
并打输出其位置
有什么好的解决方案,讨论下

9 个解决方案

#1


想到了一个,遍历一遍所有的最大值,将对应的下表存入数组,取相邻的两个就行

#2


嗯最佳也是线性时间了,LZ自己说的就挺好

#3


如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

#4


因为数组有规律  所以 楼上正解

#5


是有规律的??

#6


引用 5 楼 rui888 的回复:
是有规律的??


很像是 规则波状数组,只不过是 波峰高度不一样而已。
遍历找相邻波峰 就OK 

#7


引用 6 楼 u012842647 的回复:
Quote: 引用 5 楼 rui888 的回复:

是有规律的??


很像是 规则波状数组,只不过是 波峰高度不一样而已。
遍历找相邻波峰 就OK 

是的,不过我刚说的方法有个漏洞,如果第一个就是最大值的话,第二个波峰的位置就不会被记录

#8


引用 3 楼 oh_Maxy 的回复:
如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

这种方法有些理想化,因为这是我写成这样,实际的数组,可能出现最大值出现相邻的情况,比方说这种情况,6,7,8,8,8,,7,6你这种判断就意外情况太多了

#9


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 3 楼 oh_Maxy 的回复:

如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

这种方法有些理想化,因为这是我写成这样,实际的数组,可能出现最大值出现相邻的情况,比方说这种情况,6,7,8,8,8,,7,6你这种判断就意外情况太多了

嗯,可以再借助一个辅助变量flag,专门记录当前值大于前一个值,则flag=1,小于前一个值则flag=-1,等于前一个值不变。
每当flag由1变成-1的时候,就是峰值出现的时候。数组的开头、结尾单独判断即可。

#1


想到了一个,遍历一遍所有的最大值,将对应的下表存入数组,取相邻的两个就行

#2


嗯最佳也是线性时间了,LZ自己说的就挺好

#3


如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

#4


因为数组有规律  所以 楼上正解

#5


是有规律的??

#6


引用 5 楼 rui888 的回复:
是有规律的??


很像是 规则波状数组,只不过是 波峰高度不一样而已。
遍历找相邻波峰 就OK 

#7


引用 6 楼 u012842647 的回复:
Quote: 引用 5 楼 rui888 的回复:

是有规律的??


很像是 规则波状数组,只不过是 波峰高度不一样而已。
遍历找相邻波峰 就OK 

是的,不过我刚说的方法有个漏洞,如果第一个就是最大值的话,第二个波峰的位置就不会被记录

#8


引用 3 楼 oh_Maxy 的回复:
如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

这种方法有些理想化,因为这是我写成这样,实际的数组,可能出现最大值出现相邻的情况,比方说这种情况,6,7,8,8,8,,7,6你这种判断就意外情况太多了

#9


引用 8 楼 sjhxuelang 的回复:
Quote: 引用 3 楼 oh_Maxy 的回复:

如果都是这种离散线性正弦函数式数据,就是找峰值。
下标从0开始有n个值,感觉可以从下标1遍历到下标n-2,然后a[i]>a[i-1]&&a[i]>a[i+1],此时i就是你要的下标了

这种方法有些理想化,因为这是我写成这样,实际的数组,可能出现最大值出现相邻的情况,比方说这种情况,6,7,8,8,8,,7,6你这种判断就意外情况太多了

嗯,可以再借助一个辅助变量flag,专门记录当前值大于前一个值,则flag=1,小于前一个值则flag=-1,等于前一个值不变。
每当flag由1变成-1的时候,就是峰值出现的时候。数组的开头、结尾单独判断即可。