✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于;
2.假设 nums[-1] = nums[n] = -\infty−∞;
3.对于所有有效的 i 都有 nums[i] != nums[i + 1];
4.你可以使用O(logN)的时间复杂度实现此问题吗;
2. 输入描述
如输入[3,4,2,3,5,6,2]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为6的山峰。
如下图所示:
3. 输出描述
1
4. 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;
}
5. 测试
6.解题思路
题目要求找到数组中的峰值元素,并返回其索引。峰值元素定义为严格大于其左右相邻元素的元素。
由题目的要求可以知道,数组的首尾元素均为负无穷(-∞),而且对于所有有效的索引i,都有nums[i] != nums[i+1]
。
算法流程:
- 读取输入的数组nums。
- 获取数组的长度len。
- 如果数组长度为1,则直接返回0作为峰值元素的索引。
- 如果数组的首元素大于第二个元素,说明首元素即为峰值元素,返回0作为索引。
- 如果数组的尾元素大于倒数第二个元素,说明尾元素即为峰值元素,返回len-1作为索引。
- 遍历数组的第二个元素到倒数第二个元素(索引范围为1到len-2):
- 如果当前元素大于其左右相邻元素,即
nums[i] > nums[i-1]
且nums[i] > nums[i+1]
,则当前元素为峰值元素,返回索引i。
- 如果当前元素大于其左右相邻元素,即
- 若遍历完数组后仍未找到峰值元素,则返回0作为索引。
- 输出峰值元素的索引作为结果。