查找阵列中的多个峰,最佳算法

时间:2018-09-08 23:29:12

标签: arrays algorithm

我在Code Wars上进行了此练习,我已经解决了很多(我认为),但这不是效率最高的解决方案,我似乎找不到最佳的破解方法。

  

在此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])返回{pos: [1], peaks: [2]}(或其他语言的等效语言)

这是我在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;
  }
}

1 个答案:

答案 0 :(得分:0)

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;