统计数组中峰和谷的数量
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
/*
* 思路:
* 使用 Java Stream API 进行流式处理,首先转换为流,再使用 skip 和 limit 函数对索引进行调整,
* 然后用 IntStream.range 遍历并筛选出符合条件的元素。
*/
import java.util.stream.IntStream;
public int countPeaksAndValleys(int[] nums) {
return (int) IntStream.range(1, nums.length - 1)
.filter(i -> nums[i] != nums[i - 1] && nums[i] != nums[i + 1])
.filter(i -> (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) ||
(nums[i] < nums[i - 1] && nums[i] < nums[i + 1]))
.count();
}
解释
方法:
该题解利用两个指针,i 和 start,遍历数组 nums。对于每个元素,首先通过内部 while 循环跳过相邻的相同元素,从而定位到每个独特元素的开始和结束位置(start 和 i)。如果这个独特元素的最左侧和最右侧的不相等邻居满足峰或谷的条件(即都比它小或都比它大),则将其计为一个峰或谷。该算法只遍历数组一次,并且正确处理了相邻元素相等的情况。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在函数 `countHillValley` 中,如何确保在处理数组开头和结尾的元素时不会出现数组越界错误?
▷🦆
逻辑中提到如果两侧元素都大于或都小于中间的值则为峰或谷,但在代码中如何确保这一点,特别是考虑到相同元素的影响?
▷🦆
在跳过相同元素的while循环结束后,如何处理位于数组最末尾的元素,特别是当它们是连续相同的情况?
▷🦆
变量 `v` 在代码中的作用是什么,它如何帮助确定峰或谷?
▷