#include <experimental/random>
class Solution {
public:
template <typename It, typename Cmp = less<typename It::value_type>>
void nth_element(It lo, It mid, It hi, Cmp && cmp = Cmp()) {
typename iterator_traits<It>::difference_type zero{0};
while (lo < hi) {
iter_swap(lo, lo + std::experimental::randint(zero, hi - lo - 1));
auto pivot = *lo;
It st = lo, ed = hi - 1;
while (st < ed) {
while (st < ed && !cmp(*ed, pivot)) --ed;
*st = *ed;
while (st < ed && cmp(*st, pivot)) ++st;
*ed = *st;
}
*st = pivot;
// mid >= st, in either case, st can be passed
if (!(mid < st)) lo = st + 1;
// st >= mid, in either case, st can be passed
if (!(st < mid)) hi = st;
}
}
vector<int> smallestK(vector<int>& arr, int k) {
nth_element(arr.begin(), arr.begin() + k, arr.end());
return {arr.begin(), arr.begin() + k};
}
};
heap O(nlog(k))
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
if (!k) return {};
priority_queue<int> maxq;
for (auto n : arr) {
maxq.push(n);
if (maxq.size() > k)
maxq.pop();
}
vector<int> res(k);
while (k--) {
res[k] = maxq.top();
maxq.pop();
}
return res;
}
};