LeetCode 7022——熟悉TreeSet数据结构及常用方法的使用

Yuansj0206 / 2023-08-13 / 原文

LeetCode 7022. 限制条件下元素之间的最小绝对差

题目描述

给你一个下标从 0 开始的整数数组 nums 和一个整数 x 。

请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值 的 最小值 。

换言之,请你找到两个下标 i 和 j ,满足 abs(i - j) >= x 且 abs(nums[i] - nums[j]) 的值最小。

请你返回一个整数,表示下标距离至少为 x 的两个元素之间的差值绝对值的 最小值 。

示例 1:

输入:nums = [4,3,2,4], x = 2
输出:0
解释:我们选择 nums[0] = 4 和 nums[3] = 4 。
它们下标距离满足至少为 2 ,差值绝对值为最小值 0 。
0 是最优解。

示例 2:

输入:nums = [5,3,2,10,15], x = 1
输出:1
解释:我们选择 nums[1] = 3 和 nums[2] = 2 。
它们下标距离满足至少为 1 ,差值绝对值为最小值 1 。
1 是最优解。

示例 3:

输入:nums = [1,2,3,4], x = 3
输出:3
解释:我们选择 nums[0] = 1 和 nums[3] = 4 。
它们下标距离满足至少为 3 ,差值绝对值为最小值 3 。
3 是最优解。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9
  • 0 <= x < nums.length

解题思路:

首先第一反应,暴力,遍历(0,n-x)位置上的元素,对每个元素分别在遍历(j,n-1)的位置上的元素(j = i + x),依次求得绝对值,最后求得最小值。但是看到数据量,想都不用想,肯定会超时的╮(╯▽╰)╭。

所以,本题可以使用TreeSet数据结构,利用TreeSet去直接获取距离最近的值。

使用到的方法:

ceiling(E e):返回大于等于给定元素的最小元素,如果不存在则返回 null。

floor(E e):返回小于等于给定元素的最大元素,如果不存在则返回 null。

代码实现:

class Solution {
    public int minAbsoluteDifference(List<Integer> nums, int x) {
        int n = nums.size();
        int min = Integer.MAX_VALUE;
        
        TreeSet<Integer> treeSet = new TreeSet<>();
        for(int i=x;i<n;i++)
        {
            int pre = nums.get(i-x);
            treeSet.add(pre);

            int k = nums.get(i);
            
            Integer ceiling = treeSet.ceiling(k);
            if(ceiling != null)
            {
                min = Math.min(min,Math.abs(ceiling-k));
            }

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