力扣17.14. 最小K个数
class Solution {
public int[] smallestK(int[] arr, int k) {
int[] ret = new int[k];
if(arr.length == 0 || k == 0) {
return ret;
}
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1,Integer o2) {
return o2 - o1;
}
});
for(int value : arr) {
if(queue.size() < k) {
queue.offer(value);
} else {
if(value < queue.peek()) {
queue.poll();
queue.offer(value);
}
}
}
for (int i = 0; i < k; i++) {
ret[i] = queue.poll();
}
return ret;
}
}
运行截图:
力扣347. 前 K 个高频元素
方法一
class Solution {
private class Freq{
int key;
int freq;
public Freq(int key,int freq) {
this.key = key;
this.freq = freq;
}
}
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i : nums) {
if(map.containsKey(i)) {
int value = map.get(i);
map.put(i,value + 1);
} else {
map.put(i,1);
}
}
PriorityQueue<Freq> queue = new PriorityQueue<>(new Comparator<Freq> () {
@Override
public int compare(Freq o1,Freq o2) {
return o1.freq - o2.freq;
}
});
for(Map.Entry<Integer,Integer> entry : map.entrySet()) {
if(queue.size() < k) {
queue.offer(new Freq(entry.getKey(),entry.getValue()));
} else {
Freq peekFreq = queue.peek();
if(entry.getValue() > peekFreq.freq) {
queue.poll();
queue.offer(new Freq(entry.getKey(),entry.getValue()));
}
}
}
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
ret[i] = queue.poll().key;
}
return ret;
}
}
运行截图:
方法二
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] res = new int[k];
HashMap<Integer, Integer> map = new HashMap<>();
PriorityQueue<Integer> heap = new PriorityQueue<>((v1, v2) -> map.get(v2) - map.get(v1));
for (int i : nums) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
for (int key : map.keySet()) {
heap.add(key);
}
for (int i = 0; i < k; i++) {
res[i] = heap.remove();
}
return res;
}
}
运行截图:
力扣373. 查找和最小的 K 对数字
class Solution {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result = new ArrayList<>();
if(k <= 0) {
return result;
}
int[] indexArray = new int[nums1.length];
int startIndex = 0;
while(result.size() < k) {
int min = Integer.MAX_VALUE;
int currentIndex = -1;
for (int i = startIndex; i < nums1.length; i++) {
if(indexArray[i] == nums2.length) {
startIndex = i + 1;
continue;
}
if(nums1[i] + nums2[indexArray[i]] < min) {
min = nums1[i] + nums2[indexArray[i]];
currentIndex = i;
}
if(indexArray[i] == indexArray[indexArray.length - 1]) {
break;
}
}
if(currentIndex == -1) {
break;
}
List<Integer> data = new ArrayList<>();
result.add(data);
data.add(nums1[currentIndex]);
data.add(nums2[indexArray[currentIndex]]);
indexArray[currentIndex] = indexArray[currentIndex] + 1;
}
return result;
}
}
运行截图: