Skip to content

Commit af2f37d

Browse files
committed
feat: 215.数组中的第 K 个最大元素
1 parent 812f01a commit af2f37d

File tree

2 files changed

+186
-5
lines changed

2 files changed

+186
-5
lines changed

README.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
- [每日一题](#每日一题-2)
1616
- [树拓展题目](#树拓展题目)
1717
- [哈希表](#哈希表)
18+
- [每日一题](#每日一题-3)
19+
- [哈希表拓展题目](#哈希表拓展题目)
1820
- [双指针](#双指针)
1921
- [进阶篇](#进阶篇)
2022
- [高频面试题](#高频面试题)
@@ -111,14 +113,20 @@
111113

112114
### 哈希表
113115

116+
#### 每日一题
117+
114118
- [x] [【day-19】1.两数之和](./basic/hashmap/19.two-sum.md)
115119
- [x] [【day-20】347.前 K 个高频元素](./basic/hashmap/20.top-k-frequent-elements.md)
116120

117-
- [x] [【day-20】447.回旋镖的数量](./basic/day-20.md)
118-
- [ ] 【day-21】36.有效的数独
119-
- [x] [【day-22】645.错误的集合](./basic/day-22.md)
120-
- [x] [【day-23】面试题 04.01.节点间通路](./basic/day-23.md)
121-
- [ ] 【day-24】149.直线上最多的点数
121+
#### 哈希表拓展题目
122+
123+
- [x] [215.数组中的第 K 个最大元素](./basic/hashmap/ext-kth-largest-element-in-an-array.md)
124+
125+
- [x] [447.回旋镖的数量](./basic/day-20.md)
126+
- [ ] 36.有效的数独
127+
- [x] [645.错误的集合](./basic/day-22.md)
128+
- [x] [面试题 04.01.节点间通路](./basic/day-23.md)
129+
- [ ] 149.直线上最多的点数
122130

123131
### 双指针
124132

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# 215. 数组中的第 K 个最大元素
2+
3+
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
4+
5+
- [215. 数组中的第 K 个最大元素](#215-数组中的第-k-个最大元素)
6+
- [题目描述](#题目描述)
7+
- [方法 1:排序](#方法-1排序)
8+
- [思路](#思路)
9+
- [复杂度分析](#复杂度分析)
10+
- [代码](#代码)
11+
- [方法 2:小顶堆](#方法-2小顶堆)
12+
- [思路](#思路-1)
13+
- [复杂度分析](#复杂度分析-1)
14+
- [代码](#代码-1)
15+
16+
## 题目描述
17+
18+
```
19+
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
20+
21+
示例 1:
22+
23+
输入: [3,2,1,5,6,4] 和 k = 2
24+
输出: 5
25+
示例 2:
26+
27+
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
28+
输出: 4
29+
说明:
30+
31+
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
32+
33+
来源:力扣(LeetCode)
34+
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
35+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
36+
```
37+
38+
## 方法 1:排序
39+
40+
### 思路
41+
42+
直接给数组降序排序,再输出第 `k-1` 个数字。
43+
44+
### 复杂度分析
45+
46+
- 时间复杂度:$O(NlogN)$,N 是数组长度。
47+
- 空间复杂度:$O(1)$。
48+
49+
### 代码
50+
51+
JavaScript Code
52+
53+
```js
54+
/**
55+
* @param {number[]} nums
56+
* @param {number} k
57+
* @return {number}
58+
*/
59+
var findKthLargest = function (nums, k) {
60+
// 降序排序
61+
nums.sort((a, b) => b - a);
62+
return nums[k - 1];
63+
};
64+
```
65+
66+
## 方法 2:小顶堆
67+
68+
### 思路
69+
70+
维护一个大小为 k 的小顶堆,最后输出堆顶。
71+
72+
大顶堆也可以,就不写了。
73+
74+
### 复杂度分析
75+
76+
- 时间复杂度:$O(klogk)$。
77+
- 空间复杂度:$O(k)$。
78+
79+
### 代码
80+
81+
JavaScript Code
82+
83+
```js
84+
/**
85+
* @param {number[]} nums
86+
* @param {number} k
87+
* @return {number}
88+
*/
89+
var findKthLargest = function (nums, k) {
90+
const minHeap = new MinHeap();
91+
92+
nums.forEach(n => {
93+
const size = minHeap.size();
94+
if (size < k) minHeap.insert(n);
95+
else if (size === k) {
96+
if (minHeap.peek() < n) {
97+
minHeap.pop();
98+
minHeap.insert(n);
99+
}
100+
}
101+
});
102+
return minHeap.peek();
103+
};
104+
105+
// *************************************************
106+
107+
class Heap {
108+
constructor(list = [], comparator) {
109+
this.list = list;
110+
this.comparator = comparator;
111+
112+
this.init();
113+
}
114+
115+
init() {
116+
const size = this.size();
117+
for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {
118+
this.heapify(this.list, size, i);
119+
}
120+
}
121+
122+
insert(n) {
123+
this.list.push(n);
124+
const size = this.size();
125+
for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {
126+
this.heapify(this.list, size, i);
127+
}
128+
}
129+
130+
peek() {
131+
return this.list[0];
132+
}
133+
134+
pop() {
135+
const last = this.list.pop();
136+
if (this.size() === 0) return last;
137+
const returnItem = this.list[0];
138+
this.list[0] = last;
139+
this.heapify(this.list, this.size(), 0);
140+
return returnItem;
141+
}
142+
143+
size() {
144+
return this.list.length;
145+
}
146+
}
147+
148+
class MinHeap extends Heap {
149+
constructor(list, comparator) {
150+
if (typeof comparator != 'function') {
151+
comparator = function comparator(inserted, compared) {
152+
return inserted > compared;
153+
};
154+
}
155+
super(list, comparator);
156+
}
157+
158+
heapify(arr, size, i) {
159+
let smallest = i;
160+
const left = Math.floor(i * 2 + 1);
161+
const right = Math.floor(i * 2 + 2);
162+
if (left < size && this.comparator(arr[smallest], arr[left]))
163+
smallest = left;
164+
if (right < size && this.comparator(arr[smallest], arr[right]))
165+
smallest = right;
166+
167+
if (smallest !== i) {
168+
[arr[smallest], arr[i]] = [arr[i], arr[smallest]];
169+
this.heapify(arr, size, smallest);
170+
}
171+
}
172+
}
173+
```

0 commit comments

Comments
 (0)