@@ -69,27 +69,44 @@ class Solution {
69
69
*/
70
70
71
71
// 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
72
98
class Solution {
73
99
public:
74
100
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);
87
107
}
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 ());
94
111
}
95
112
};
0 commit comments