大家好,我是晴天學長,今天用到了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的理解(紅黑樹)