大家好,我是晴天学长,今天用到了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的理解(红黑树)