java - 从给定范围内的数组中查找峰值

标签 java arrays algorithm

方法 getPeakCount 将一个 int 数组和一个范围 (int) 作为输入,并返回大于的整数数量给定范围内两侧的所有元素。

例如,考虑一个数组 {1,4,2,6,4,5,10,8,7,11} 和范围 2。结果应为 3,如 {..,4,2,6,4,5,..}, {..,4,5, 10,8,7,..}{..,8,7,11} 满足此条件。这些满足条件,因为 61011 都大于其左侧和右侧的 2 个元素。

请注意,对于像111这样的角元素,不需要分别检查左侧和右侧。

我的代码如下,但不正确。

static int getPeakCount(int[] arr, int R) {
        int result=0;
        for(int i=0;i<arr.length;i++){
        if(i==0){
            if(arr[i]>arr[i+1]&&arr[i]>arr[i+2]){
                result++;
            }
             } //-----> closing if(i==0) condition
            else if(i==arr.length-1){
                if(arr[i]>arr[i-1]&&arr[i]>arr[i-2]){
                    result++;
                }

            }
            else if(i+R>arr.length){
                if(arr[i]>arr[i-R] && arr[i]>arr[i-R+1]){
                    System.out.println(arr[i]);
                    result++;
                }
            }
            else{

                if(arr[i]>arr[i+1] && arr[i]>arr[i+2] && arr[i]>arr[i-R] && arr[i]>arr[i-R+1]){
                    System.out.println(arr[i]);
                    result++;
            }
        }
    }
    return result;
}

我不知道我是否朝着正确的方向前进,对于最后一个 if 条件,它抛出了 java.lang.ArrayIndexOutOfBoundsException

附注不要将此代码视为消除错误的解决方案。这只是我的尝试。

最佳答案

我认为这个想法是对的,devnull 是对的。您只需要检查中心,因此将循环更改为从 1 开始并在结束之前结束 1。我注释掉了最终条件。我认为这符合您的要求,尽管不能 100% 确定我理解您的要求。

我应该补充一点,为了清楚起见,我使用了 l(左)、r(右)和 c(中)等变量。如果您有大型数组,则可以使速度更快。它还存在冗余,因为它检查它应该知道的条件是否已经为假(如果我找到峰值,我应该跳过下一个值,因为它不可能也是峰值)。

public class PeakChecker {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int[] array = new int[]{1, 4, 2, 6, 4, 5, 10, 8, 7, 11};

        System.out.println(nPeaks(array, 2));
    }

    static int nPeaks(int[] array, int range) {

        // Check for special cases
        if (array == null) {
            return 0;
        }

        int result = 0, l, r;

        // Check main body
        for (int i = 0; i < array.length; i++) {
            boolean isPeak = true;
            // Check from left to right
            l = Math.max(0, i - range);
            r = Math.min(array.length - 1, i + range);
            for (int j = l; j <= r; j++) {
                // Skip if we are on current
                if (i == j) {
                    continue;
                }
                if (array[i] < array[j]) {
                    isPeak = false;
                    break;
                }
            }

            if (isPeak) {
                System.out.println("Peak at " + i + " = " + array[i]);
                result++;
                i += range;
            }
        }

        return result;
    }
}

关于java - 从给定范围内的数组中查找峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663141/

相关文章:

java - 如何重写sql语句以与hibernate一起工作?

java - Mockito 如何模拟和断言抛出的异常?

java - 如何在泛型方法中使用整数数组?

c# - 我如何让一个类存储在一个二维数组 "aware"中它们的位置呢?

android - 任何算法来检查包含特定颜色的每个像素?在安卓 :)

java - 从 REST 中的资源路径获取占位符值?

java - 如何外部化 Hibernate 3.6 配置

c - 如何将字符串插入到c中的数组中

perl - 是否有因子图和积调度的 Perl 实现?

algorithm - 算法的大O