1-leetcode215. 数组中的第K个最大元素
注意:×
- 先是写完了归并排序和快速排序
- 这个题目可以直接用PriorQueue来解决问题
- 也可以使用快速排序的Patition函数来解决
public int findKthLargest(int[] nums, int k) {
int low = 0;
int high = nums.length - 1;
int kk = nums.length-k;
while (low <= high) {
int p = patition(nums, low, high);
if (p < kk) {
low = p + 1;
} else if (p > kk) {
high = p - 1;
} else {
return nums[p];
}
}
return -1;
}
private int patition(int[] nums, int low, int high) {
int pNum = nums[low];
int i = low + 1;
int j = high;
while (i <= j) {
while (i < high && nums[i] <= pNum) {
i++;
}
while (j > low && nums[j] > pNum){
j--;
}
if (i >= j) {
break;
}
swap(nums, i, j);
}
swap(nums, low, j);
return j;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
2-leetcode347. 前 K 个高频元素
注意:×
- 知道思路,但是还是写错了
- 问题是在lamda传入 PriorityQueue的时候出了问题,一直没有办法
e1.getValue().compareTo
- 原因:需要在PriorityQueue<Map.Entry
<Integer, Integer>
>指定类型,才会出现compareTo
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> valToFre = new HashMap<>();
for (int num : nums) {
valToFre.put(num, valToFre.getOrDefault(num, 0) + 1);
}
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(
(e1, e2) -> {return e1.getValue().compareTo(e2.getValue());}
);
for (Map.Entry<Integer, Integer> integerIntegerEntry : valToFre.entrySet()) {
pq.add(integerIntegerEntry);
if (pq.size() > k){
pq.poll();
}
}
int[] res = new int[k];
for (int i = k-1; i >= 0; i--) {
res[i] = pq.poll().getKey();
}
return res;
}
3-leetcode
注意:√×