Pick peaks

问题

给一个数组,返回这个数组中所有的峰值及其在数组中的位置,如果峰值为多个相等得数,则取第一个。

例子

[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]为止就可以确定峰值了。

猜你喜欢

转载自blog.csdn.net/qqqq0199181/article/details/80806561