方法 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}
满足此条件。这些满足条件,因为 6
、10
和 11
都大于其左侧和右侧的 2 个元素。
请注意,对于像1
和11
这样的角元素,不需要分别检查左侧和右侧。
我的代码如下,但不正确。
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/