Skip to content

Commit 8d48179

Browse files
authored
Update 0215-kth-largest-element-in-an-array.cpp
1 parent 7f4610a commit 8d48179

File tree

1 file changed

+35
-18
lines changed

1 file changed

+35
-18
lines changed

Diff for: cpp/0215-kth-largest-element-in-an-array.cpp

+35-18
Original file line numberDiff line numberDiff line change
@@ -69,27 +69,44 @@ class Solution {
6969
*/
7070

7171
// Video's QuickSelect implementation
72+
// class Solution {
73+
// public:
74+
// int findKthLargest(vector<int>& nums, int k) {
75+
// int index = nums.size() - k;
76+
// return quickSelect(nums, index, 0, nums.size() - 1);
77+
// }
78+
// private:
79+
// int quickSelect(vector<int>& nums, int k, int l, int r){
80+
// int pivot = nums[r];
81+
// int p_pos = l;
82+
// for (int i = l; i < r; ++i){
83+
// if (nums[i] <= pivot){
84+
// swap(nums[i], nums[p_pos]);
85+
// ++p_pos;
86+
// }
87+
// }
88+
// swap(nums[p_pos], nums[r]);
89+
// if (k < p_pos)
90+
// return quickSelect(nums, k, l, p_pos - 1);
91+
// if (k > p_pos)
92+
// return quickSelect(nums, k, p_pos + 1, r);
93+
// return nums[p_pos];
94+
// }
95+
// };
96+
97+
// Solution that can pass current tests
7298
class Solution {
7399
public:
74100
int findKthLargest(vector<int>& nums, int k) {
75-
int index = nums.size() - k;
76-
return quickSelect(nums, index, 0, nums.size() - 1);
77-
}
78-
private:
79-
int quickSelect(vector<int>& nums, int k, int l, int r){
80-
int pivot = nums[r];
81-
int p_pos = l;
82-
for (int i = l; i < r; ++i){
83-
if (nums[i] <= pivot){
84-
swap(nums[i], nums[p_pos]);
85-
++p_pos;
86-
}
101+
int pivot = nums[rand() % nums.size()];
102+
vector<int> left, mid, right;
103+
for (auto num: nums) {
104+
if (num > pivot) left.push_back(num);
105+
else if (num == pivot) mid.push_back(num);
106+
else right.push_back(num);
87107
}
88-
swap(nums[p_pos], nums[r]);
89-
if (k < p_pos)
90-
return quickSelect(nums, k, l, p_pos - 1);
91-
if (k > p_pos)
92-
return quickSelect(nums, k, p_pos + 1, r);
93-
return nums[p_pos];
108+
if (k <= left.size()) return findKthLargest(left, k);
109+
else if (k <= left.size() + mid.size()) return mid[0];
110+
else return findKthLargest(right, k - left.size() - mid.size());
94111
}
95112
};

0 commit comments

Comments
 (0)