LeetCode 第358场周赛 恒生专场。
剑指Offer:限制条件下元素之间的最小绝对差
【题目描述】
给你一个下标从 0 开始的整数数组 nums
和一个整数 x
。
请你找到数组中下标距离至少为 x
的两个元素的 差值绝对值 的 最小值 。
换言之,请你找到两个下标 i
和 j
,满足 abs(i - j) >= x
且 abs(nums[i] - nums[j])
的值最小。
请你返回一个整数,表示下标距离至少为 x
的两个元素之间的差值绝对值的 最小值 。
示例:
输入:nums = [4,3,2,4], x = 2
输出:0
解释:我们选择 nums[0] = 4 和 nums[3] = 4 。它们下标距离满足至少为 2 ,差值绝对值为最小值 0 。0 是最优解。
输入:nums = [5,3,2,10,15], x = 1
输出:1
解释:我们选择 nums[1] = 3 和 nums[2] = 2 。它们下标距离满足至少为 1 ,差值绝对值为最小值 1 。1 是最优解。
输入:nums = [1,2,3,4], x = 3
输出:3
解释:我们选择 nums[0] = 1 和 nums[3] = 4 。它们下标距离满足至少为 3 ,差值绝对值为最小值 3 。3 是最优解。
限制:
- 1 <= nums.length <= 105
- 1 <= nums[i] <= 109
- 0 <= x < nums.length
解题思路:
class Solution {
public static int minAbsoluteDifference(List<Integer> nums, int x) {
int min = Integer.MAX_VALUE;
TreeSet<Integer> tree = new TreeSet();
for (int i = x; i < nums.size(); i++) {
tree.add(nums.get(i - x));
Integer currentNum = nums.get(i);
// 小于currentNum的最大值
Integer floor = tree.floor(currentNum);
// 大于currentNum的最小值
Integer ceiling = tree.ceiling(currentNum);
if (floor != null) {
min = Math.min(Math.abs(floor - currentNum), min);
}
if (ceiling != null) {
min = Math.min(Math.abs(ceiling - currentNum), min);
}
}
return min;
}
}