我有一个关于代码战的练习,我已经解决了很多问题(我想),但它不是最有效的解决方案,我似乎找不到破解它的最佳算法。
在这个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/

10-12 18:05