Skip to content

Commit 88e6b71

Browse files
authored
up 215.第K大元素
1 parent 8b6208c commit 88e6b71

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

algorithms/algo_notes/TopK问题.md

+44
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,47 @@ public:
7272
}
7373
};
7474
```
75+
## 215.第K大元素 https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
76+
77+
```c++
78+
int findKthLargest(vector<int>&nums, int k) {
79+
priority_queue<int, vector<int>, greater<int>>Q;
80+
for(auto& n : nums) {
81+
Q.push(n);
82+
if(Q.size() > k) Q.pop();
83+
}//建立一个大根堆,做 k - 1k−1 次删除操作后堆顶元素就是我们要找的答案
84+
return Q.top();
85+
}
86+
//手写最大堆排序
87+
class Solution {
88+
public:
89+
void makeHeapify(std::vector<int>&nums, int i, int heap_size) {
90+
int l = i * 2 + 1, r = i * 2 + 2, largest = i;
91+
if (l < heap_size && nums[l] > nums[largest]) {
92+
largest = l;
93+
}
94+
if (r < heap_size && nums[r] > nums[largest]) {
95+
largest = r;
96+
}
97+
if (largest != i) {
98+
swap(nums[i], nums[largest]);
99+
makeHeapify(nums, largest, heap_size);
100+
}
101+
}
102+
void buildMaxHeap(std::vector<int>&nums, int heap_size) {
103+
for (int i = heap_size / 2; i >= 0; --i) {
104+
makeHeapify(nums, i, heap_size);
105+
}//从叶子节点开始堆化
106+
}
107+
int findKthLargest(vector<int>&nums, int k) {
108+
int heap_size = nums.size();
109+
buildMaxHeap(nums, heap_size);
110+
for (int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {
111+
swap(nums[0], nums[i]);
112+
--heap_size;
113+
makeHeapify(nums, 0, heap_size);
114+
}
115+
return nums[0];
116+
}
117+
};
118+
```

0 commit comments

Comments
 (0)