```重构findKthLargest方法使用堆优化
重构'findKthLargest'方法以使用堆优化。新的实现使用一个固定长度的小顶堆来维护当前最小的k个元素。遍历输入数组时,将每个元素与堆顶元素比较,如果大于堆顶元素,则移除堆顶元素并将新元素插入堆中,以确保堆中始终包含数组中最大的k个元素。最后,堆顶元素即为第k大的元素。 此实现的优势在于对于大数据集,它提供了更高效的性能,尤其是在k相对较小而输入数组很大时。通过堆的使用,避免了对整个数组进行完全排序的需要,从而降低了计算复杂度。 ```
This commit is contained in:
parent
dde621339d
commit
4895af547b
@ -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) {
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user