import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param heights int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int findMaxRangeWithinThreshold (int[] heights, int k) {
        // write code here
        int res = 0;
        List<Integer> S = new ArrayList<>();

        for (int i = 0, j = 0; i < heights.length; i++) {
            S.add(heights[i]); // 将当前地区的高度加入
            
            Collections.sort(S);
            // 当最大高度和最小高度的差大于 k 时,移除最左侧的元素,缩小范围
            while (!S.isEmpty() && S.get(S.size()-1) - S.get(0) > k) {
                S.remove((Integer) heights[j]); //必须用Integer转,否则remove就根据index删除了
                j++;
            }

            // 更新最大地区范围
            res = Math.max(res, i - j + 1);
        }

        return res;
    }
}

Java代码

知识点:

  1. 滑动窗口
  2. 集合,排序,最大小值

文字解释:

int res 结果。

维护一个动态的窗口 S 来存储当前地区的高度。在每次遍历时,将当前地区的高度加入窗口 S 中,并排序该列表。

使用一个 while 循环来检查窗口的最大高度和最小高度之间的差是否大于给定的阈值 k,如果是,则从窗口最左侧移除元素,缩小窗口的范围。

通过比较当前地区的范围与之前的最大范围,更新最大地区范围 res。