找到k個最接近x的元素

Tofaker發表於2020-11-16

給定一個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x(兩數之差最小)的 k 個數。返回的結果必須要是按升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。

連結:https://leetcode-cn.com/problems/find-k-closest-elements

思路 : 建立大根堆(修改比較器規則:與x的差值的大根堆)
每次放入元素進行比較:與x的差值的結果進行比較
小於則 堆poll 堆offer(新元素)

	最後大根堆放入的是差值最小的k個元素,再轉為小根堆,然後給List輸出

class Solution {
public List findClosestElements(int[] arr, int k, int x) {
List list = new LinkedList<>();
Queue queue = new PriorityQueue<>(new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return Math.abs(o2-x)-Math.abs(o1-x);
}
});
for (int i = 0; i < arr.length ; i++) {
if (i < k) {
queue.offer(arr[i]);
}
else if (Math.abs(arr[i]-x) < Math.abs(queue.peek()-x)){
queue.poll();
queue.offer(arr[i]);
}
}
Queue queue1 = new PriorityQueue<>();
while (!queue.isEmpty()) {
queue1.offer(queue.poll());
}
while (!queue1.isEmpty()){
list.add(queue1.poll());
}
return list;
}
}

相關文章