LeetCode算法心得——限制条件下元素之间的最小绝对差(TreeSet)

大家好,我是晴天学长,今天用到了Java一个非常实用的类TreeSet,能解决一些看起来棘手的问题。


1 )限制条件下元素之间的最小绝对差


2) .算法思路

  • 初始化变量:
  • n为列表nums的大小。
    min为整型最大值,用于记录最小的差的绝对值。
    创建一个TreeSet类型的变量treeSet,用于存储当前nums[0, i-x]范围内的元素。
  • 通过循环遍历列表nums,从索引x开始迭代,直到列表结束。
  • 在循环内部执行以下操作:
  • 获取索引i-x处的元素,并将其添加到treeSet中。
  • 获取索引i处的元素,并与treeSet中的元素进行比较。
    使用treeSet的ceiling方法查找大于等于当前元素的最小元素,并将其赋值给celling。
  • 如果celling不为null,则计算当前元素与celling的差的绝对值,并更新min为较小值。
    使用treeSet的floor方法查找小于等于当前元素的最大元素,并将其赋值给floor。
  • 如果floor不为null,则计算当前元素与floor的差的绝对值,并更新min为较小值。
    循环结束后,返回min作为结果,表示列表nums中与给定整数x的差的绝对值最小的值。

3).代码示例

class Solution {
        public int minAbsoluteDifference(List<Integer> nums, int x) {
            int n = nums.size();
            int min = Integer.MAX_VALUE;
            //存入当前nums[0,i-x]的元素
            TreeSet<Integer> treeSet = new TreeSet<>();
            for (int i = x; i <n ; i++) {
                int temp = nums.get(i-x);
                treeSet.add(temp);

                //比较
                 int k = nums.get(i);

                 Integer celling = treeSet.ceiling(k);
                 if (celling!= null) {
                     min = Math.min(min, Math.abs(k - celling));
                 }

                 Integer floor = treeSet.floor(k);
                 if (floor!= null) {
                     min = Math.min(min, Math.abs(floor - k));
                 }
            }
            return min;
        }

4).总结

  • TreeSet的理解(红黑树)

你可能感兴趣的:(算法,leetcode,java)