问题
给一个数组,返回这个数组中所有的峰值及其在数组中的位置,如果峰值为多个相等得数,则取第一个。
例子
[3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3] =>{pos: [3, 7], peaks: [6, 3]}
我的代码
package codewars;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
public class PickPeaks {
public static Map<String,List<Integer>> getPeaks(int[] arr) {
Map<String, List<Integer>> result = new HashMap<>();
List<Integer> pos = new ArrayList<>();
List<Integer> peaks = new ArrayList<>();
int pre = 0;
int cur = 1;
int next = 2;
while (arr.length >= 3 && next < arr.length) {
if (arr[cur] > arr[pre] && arr[cur] > arr[next]) {
pos.add(cur);
peaks.add(arr[cur]);
next++;
cur = next - 1;
pre = cur - 1;
} else if (arr[cur] > arr[pre] && arr[cur] == arr[next]) {
next++;
} else {
next++;
cur = next - 1;
pre = cur - 1;
}
}
result.put("pos", pos);
result.put("peaks", peaks);
return result;
}
public static void main(String[] args) {
System.out.println(PickPeaks.getPeaks(new int[]{2,1,3,1,2,2,2,2}));
}
}
分析
这道题的思路是,峰值的特征是中间高两边低,所以设置3个位置pre:前边,cur:当前位置,next:后边。当arr[cur] > arr[pre] && arr[cur] > arr[next])时,cur就是峰值的位置。这里有个特殊情况要考虑进去,就是1,2,2,1这种峰值是两个数的情况,当遇到这种情况的时候,next继续++,直到找到一个arr[cur] > arr[next]为止就可以确定峰值了。