一、题目描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于;
2.假设 nums[-1] = nums[n] = -\infty−∞;
3.对于所有有效的 i 都有 nums[i] != nums[i + 1];
4.你可以使用O(logN)的时间复杂度实现此问题吗;
二、输入描述
如输入[3,4,2,3,5,6,2]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为6的山峰。
如下图所示:
三、输出描述
1
四、解题思路
- 读取输入的数组nums;
- 获取数组的长度len;
- 如果数组长度为1,则直接返回0作为峰值元素的索引;
- 如果数组的首元素大于第二个元素,说明首元素即为峰值元素,返回0作为索引;
- 如果数组的尾元素大于倒数第二个元素,说明尾元素即为峰值元素,返回len-1作为索引;
- 遍历数组的第二个元素到倒数第二个元素(索引范围为1到len-2):
- 如果当前元素大于其左右相邻元素,即nums[i] > nums[i-1]且nums[i] > nums[i+1],则当前元素为峰值元素,返回索引i;
- 若遍历完数组后仍未找到峰值元素,则返回0作为索引;
- 输出峰值元素的索引作为结果;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String[] arr=sc.nextLine().split(",");
int[] nums = Arrays.asList(arr).stream().mapToInt(Integer::parseInt).toArray();
System.out.println(findPeakElement(nums));
}
}
public static int findPeakElement(int[] nums) {
//分析长度为1的情况
int len = nums.length;
if(len == 1){
return 0;
}
//分析索引为0比1大的情况
if(nums[0] > nums[1]){
return 0;
}
//分析倒数第二到倒数第一的情况
if(nums[len-1]>nums[len-2]){
return len-1;
}
//分析第二到倒数第二的情况
for(int i = 1; i < len-1 ;i++){
if(nums[i]>nums[i-1]&nums[i]>nums[i+1]){
return i;
}
}
//其余情况返回为0
return 0;
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。