```重构findKthLargest方法使用堆优化

重构'findKthLargest'方法以使用堆优化。新的实现使用一个固定长度的小顶堆来维护当前最小的k个元素。遍历输入数组时,将每个元素与堆顶元素比较,如果大于堆顶元素,则移除堆顶元素并将新元素插入堆中,以确保堆中始终包含数组中最大的k个元素。最后,堆顶元素即为第k大的元素。

此实现的优势在于对于大数据集,它提供了更高效的性能,尤其是在k相对较小而输入数组很大时。通过堆的使用,避免了对整个数组进行完全排序的需要,从而降低了计算复杂度。
```
This commit is contained in:
kyriewhluo 2024-08-30 20:06:28 +08:00
parent dde621339d
commit 4895af547b

View File

@ -24,6 +24,82 @@ public class LeetCode215 {
// System.out.println(i);
}
@Test
public void test1()
{
new sol().findKthLargest(new int[]{3, 2, 1, 5, 6, 4}, 3);
}
class sol{
/**
* 3
* / \
* / \
* 5 -2147483648
* /
* 2 右边那个有问题所以不行
* @param nums
* @param k
* @return
*/
public int findKthLargest(int[] nums, int k) {
Heap heap = new Heap(k);
for (int num : nums) {
heap.add(num);
}
return 1;
}
}
class Heap{
int[] heap = null;
public Heap(int k) {
this.heap = new int[k + 1];
Arrays.fill(this.heap, Integer.MIN_VALUE);
}
public void add(int num) {
heap[heap.length - 1] = num;
shiftUp(heap, heap.length - 1);
}
/**
* 固定长度的让其 shiftUp
* @param nums
* @param numIndex numsIndex 位置上移
*/
public void shiftUp(int[] nums, int numIndex) {
int k = numIndex;
while (k > 0) {
int parent = (k - 1) / 2;
// if (nums[numIndex] < nums[parent]) { // 小顶堆
if (nums[k] > nums[parent]) { // 大顶堆
// 小顶堆小的上移
swap(nums, parent, k);
k = parent;
}else {
break;
}
TreeNode.constructTreeByArrayWithInteger(nums);
}
}
public void swap(int[] nums, int start, int end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
}
}
class Solution {
public int findKthLargest(int[] nums, int k) {