考察的知识点:双指针;
解答方法分析:
- 初始化变量 ans 为 0,用于记录最大的连续子数组范围大小。
- 定义两个指针 i 和 j,初始值都为 0,用于标记当前连续子数组的起始位置。
- 初始化变量 maxElement 和 minElement,分别用于记录当前连续子数组中的最大值和最小值,初始值均为 heights[0]。
- 进入循环,循环条件是 i 小于 heights 的长度且 j 小于 heights 的长度。这是因为 j 表示连续子数组的结束位置,当 j 超过了列表的长度时,意味着已经遍历完整个列表。
- 在循环中,首先更新 maxElement 和 minElement,将 heights[i] 和 heights[j] 与当前的最大值和最小值进行比较并更新。
- 计算当前连续子数组的最大值和最小值之差,并将其保存在变量 temp 中。
- 如果 temp 大于等于 0 并且小于等于 k,说明当前连续子数组满足要求,计算连续子数组的范围(j - i + 1),并将其与 ans 进行比较并更新最大值。
- 将 j 指针向后移动一位。
- 如果 temp 不满足要求,即大于 k,则说明当前连续子数组不满足要求,需要重新寻找下一个符合要求的子数组。将 i 和 j 设置为下一个子数组的起始位置,并更新 maxElement 和 minElement 为新的起始位置上的元素。
- 循环结束后,返回 ans,即最大的连续子数组范围大小。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param heights int整型vector * @param k int整型 * @return int整型 */ int findMaxRangeWithinThreshold(vector<int>& heights, int k) { int ans = 0; int i = 0, j = 0; int maxElement = heights[0], minElement = heights[0]; while (i < heights.size() && j < heights.size()) { maxElement = max(maxElement, max(heights[i], heights[j])); minElement = min(minElement, min(heights[i], heights[j])); int temp = maxElement - minElement; if (temp >= 0 && temp <= k) { ans = max(ans, j - i + 1); j++; } else { i++; j = i; maxElement = minElement = heights[i]; } } return ans; } };