我有一个关于代码战的练习,我已经解决了很多问题(我想),但它不是最有效的解决方案,我似乎找不到破解它的最佳算法。
在这个KATA中,您将编写一个函数,返回一个数字数组的“峰值”(或局部极大值)的位置和值。
例如,数组在arr = [0, 1, 2, 5, 1, 0]
位置有一个峰值,其值为3
(因为5
等于arr[3]
)。
输出将作为5
返回,其中有两个键值对:Map<String,List<integer>>
和"pos"
。如果给定数组中没有峰值,只需返回"peaks"
。
示例:{"pos" => [], "peaks" => []}
应返回pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3])
(或其他语言中的等效值)
所有输入数组都将是有效的整数数组(尽管它可能仍然是空的),因此不需要验证输入。
数组的第一个和最后一个元素将不会被视为峰值(在数学函数的上下文中,我们不知道在之后和之前是什么,因此,我们不知道它是否是峰值)。
另外,小心高原{pos: [3, 7], peaks: [6, 3]}
有一个峰值,而[1, 2, 2, 2, 1]
没有如果是高原峰值,请只返回高原起点的位置和值例如:[1, 2, 2, 2, 3]
返回pickPeaks([1, 2, 2, 2, 1])
(或其他语言中的等效值)
以下是我的Java解决方案:
import java.util.*;
import java.util.List;
public class PickPeaks {
public static Map<String,List<Integer>> getPeaks(int[] arr) {
HashMap<String,List<Integer>> retVal = new HashMap<>();
ArrayList<Integer> peakArr = new ArrayList<Integer>();
ArrayList<Integer> posArr = new ArrayList<Integer>();
Get the size of the Array
int sizeArr = arr.length;
System.out.println(" sizeArr >> " + sizeArr);
while(sizeArr > 0){
for ( int index = 1; index < sizeArr; index++){
if((arr[index]) > (arr[index-1]) && (arr[index+1]) < (arr[index])){
System.out.println(" Peak >>> " + arr[index] + " Position >>> " + index);
posArr.add(index);
peakArr.add(arr[index]);
// Dealing with plateaus
}else if ((arr[index]) > (arr[index-1]) && (arr[index+1]) == (arr[index])){
posArr.add(index);
peakArr.add(arr[index]);
}
}
System.out.println("Pos Array >> "+ posArr +"Peak Array >> " + peakArr);
retVal.put("pos",posArr);
retVal.put("peaks",peakArr);
System.out.println("Retval >> " + retVal.toString());
}
return retVal;
}
}
最佳答案
List<Integer> pos=new ArrayList<>(); List<Integer> pea=new ArrayList<>();
Map<String,List<Integer>> ma=new HashMap<String,List<Integer>>();
int cur=0,pre=0;
HashMap<String,Integer> hm=new HashMap<String,Integer>();
for(int a=1;a<arr.length;a++){
if(arr[a]>arr[cur] ){
pre=cur;cur=a;
}else{
if(arr[a]<arr[cur])
if(arr[pre]<arr[cur]){
pos.add(cur);pea.add(arr[cur]);}
pre=cur;cur=a;
}
}
ma.put("pos",pos);ma.put("peaks",pea);
return ma;
关于arrays - 查找阵列中的多个峰,最佳算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52240179/