class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if (null == arr || k <= 0) {
return new int[0];
}
final int n = arr.length;
Queue<Integer> pq = new PriorityQueue<>(k, (o1, o2) -> (o2 - o1));
for (int i = 0; i < n; i ++) {
if (pq.size() < k) {
pq.add(arr[i]);
continue;
}
if (pq.peek() > arr[i]) {
pq.poll();
pq.add(arr[i]);
}
}
int[] res = new int[k];
for (int i = 0; i < k; i ++) {
res[i] = pq.poll();
}
return res;
}
}
class Solution {
private class Element {
public Integer value;
public Integer number;
public Element(Integer value, Integer number) {
this.value = value;
this.number = number;
}
}
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (Integer num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
Queue<Element> pq = new PriorityQueue<>(k, (e1, e2) ->(e1.number - e2.number));
for (Integer key : map.keySet()) {
Element e = new Element(key, map.get(key));
if (pq.size() < k) {
pq.add(e);
continue;
}
if (e.number > pq.peek().number) {
pq.poll();
pq.add(e);
}
}
int[] res = new int[k];
for (int i = 0; i < k; i ++) {
res[i] = pq.poll().value;
}
return res;
}
}
class Solution {
public int[][] kClosest(int[][] points, int k) {
int n = points.length;
Queue<Element> pq = new PriorityQueue<>(k, (e1, e2) -> (int)(e2.len - e1.len));
for (int[] point : points) {
Double len = Math.pow(point[0], 2) + Math.pow(point[1], 2);
Element e = new Element(point, len);
if (pq.size() < k) {
pq.add(e);
continue;
}
if (pq.peek().len > len) {
pq.poll();
pq.add(e);
}
}
int[][] res = new int[k][2];
for (int i = 0; i < k; i ++) {
res[i] = pq.poll().point;
}
return res;
}
private class Element {
private int[] point;
private Double len;
private Element(int[] point, Double len) {
this.point = point;
this.len = len;
}
}
}
class Solution {
private class Element {
public List<Integer> list;
public int sum;
public Element(List<Integer> list, int sum) {
this.list = list;
this.sum = sum;
}
}
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
Queue<Element> pq = new PriorityQueue<>(k, (e1, e2) -> (e2.sum - e1.sum));
for (int i = 0; i < nums1.length; i ++) {
for (int j = 0; j < nums2.length; j ++) {
List<Integer> list = new ArrayList<>();
list.add(nums1[i]);
list.add(nums2[j]);
int sum = nums1[i] + nums2[j];
Element e = new Element(list, sum);
if (pq.size() < k) {
pq.add(e);
continue;
}
if (pq.peek().sum > e.sum) {
pq.poll();
pq.add(e);
} else {
break;
}
}
}
List<List<Integer>> res = new ArrayList<>(k);
while (!pq.isEmpty()) {
res.add(pq.poll().list);
}
return res;
}
}