大家好,有人可以用我的代码帮助我
如果你想知道什么是找高峰
,这是一个寻找高峰的代码你去吧
给定一个整数数组。找到其中的峰值元素。如果数组元素不小于其邻居,则它是峰值。对于角落元素,我们只需要考虑一个邻居。例如,对于输入数组{5,10,20,15},20是唯一的峰值元素。对于输入数组{10,20,15,2,23,90,67},有两个峰值元素:20和90.请注意,我们需要返回任何一个峰值元素。
我的问题是,如果我的代码找不到峰值元素 它位于数组的第一个位置或最后一个位置
这是我的代码很简单
public static void main(String[] args) {
int [] arr = {1,2,3,4,1,3,3,7,8,2,16};
peakFinding(arr, 0,arr.length);
}
public static void peakFinding(int [] arr,int start ,int end){
int mid = (start+end)/2;
if(arr[mid]<=arr[mid+1]){
start = mid;
end = arr.length;
peakFinding(arr, start, end);
}else if(arr[mid]<=arr[mid-1]){
start = 0;
end = mid-1;
peakFinding(arr, start, end);
}else{
System.out.println("I have found peak "+arr[mid]);
}
}
答案 0 :(得分:1)
鉴于您只需要找到一个元素,并且选择是任意的,请考虑将边视为特殊情况。在致电peakFinding
之前包含
if (arr == null || arr.length < 2){
/*do nothing, no elements*/
} else if (arr[0] >= arr[1]){
/*first element is peak*/
} else if (arr[arr.length - 1] >= arr[arr.length - 2]){
/*last element is peak*/
} else {
/*call peakFinding*/
}
我的第一张检查也修复了您可能遇到的潜在错误。
这样做可以保持程序复杂部分的清晰度。
最后,考虑将peakFinding
的返回类型更改为返回元素的位置(return mid;
),然后输出消息将在一个位置进行编码。 / p>
答案 1 :(得分:1)
在回答你的问题之前,我觉得你的peakFinding的起始部分看起来并不是很好,而不是
int mid = (start+end)/2;
如果开始和结束太大并且接近Integer.MAX_VALUE可能会出现问题,请尝试
int mid = start + (end - start) / 2;
另外,如果你添加一些代码来验证输入(对数组进行空检查,或者开始&lt; =结束那样的事情),那就更好了。
现在让我们谈谈你的算法,它是一个二进制搜索。
public static void peakFinding(int [] arr,int start ,int end){
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(arr[mid] <= arr[mid+1]) {
start = mid;
} else if (arr[mid] <= arr[mid-1]) {
end = mid;
} else {
System.out.println(arr[mid]);
return;
}
}
if(arr[start] > arr[end]) {
System.out.println(arr[start]);
} else {
System.out.println(arr[end]);
}
}
答案 2 :(得分:0)
您的程序找不到所有峰值。
如果是第一个arr[mid] <= arr[mid + 1]
子句中的条件if
返回true
,这意味着仅在数组的右侧部分搜索峰值。不再搜索数组的左侧部分,尽管在数组的左侧也可能存在峰值。