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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值