class Solution {
public:
//单边循环法
int quickselect(vector<int>&a,int l,int r,int index)
{
int q=randompartition(a,l,r);
if(q==index)
{
return a[q];
}
else
{
return q<index ?quickselect(a,q+1,r,index):quickselect(a,l,q-1,index);
}
}
inline int randompartition(vector<int> &a ,int l,int r)
{
//生成1-(r-l+1)的随机数
int i=rand() % (r-l+1)+l;
swap(a[i],a[r]);
return partition(a,l,r);
}
inline int partition(vector<int> &a,int l,int r)
{
int x=a[r],i=l-1;
for(int j=l;j<r;++j)
{
if(a[j]<=x)
{
swap(a[++i],a[j]);
}
}
swap(a[i+1],a[r]);
return i+1;
}
int findKthLargest(vector<int>& nums, int k) {
srand(time(0));
return quickselect(nums,0,nums.size()-1,nums.size()-k);
}
};
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
//创建一个哈希表
unordered_map <int ,int> counts;
int max_count=0;
//遍历找到最大值
for(const int & num:nums)
{
max_count=max(max_count,++counts[num]);
}
//创建一个桶
vector<vector<int>> buckets(max_count+1);
//遍历把数字放入桶中,返回前k项
for(const auto &p :counts)
{
buckets[p.second].push_back(p.first);
}
vector<int> ans;
for(int i=max_count;i>=0&&ans.size()<k;i--)
{
for(const int & num:buckets[i])
{
ans.push_back(num);
if(ans.size()==k)
{
break;
}
}
}
return ans;
}
};
class Solution {
public:
string frequencySort(string s) {
unordered_map<char,int> counts;
int max_count=0;
for(const char a:s)
{
max_count=max(++counts[a],max_count);
}
vector<string> buckets(max_count+1);
//遍历把数字放入桶中
for(auto & p :counts)
{
buckets[p.second].push_back(p.first);
}
string ans;
for(int i=max_count;i>0;i--)
{
for(auto & num:buckets[i])
{
for (int k = 0; k < i; k++) {
ans.push_back(num);
}
}
}
return ans;
}
};
class Solution {
public:
//先移动0 在移动1
void sortColors(vector<int>& nums) {
int n=nums.size();
int ptr=0;
for(int i=0;i<n;i++)
{
if(nums[i]==0)
{
swap(nums[i],nums[ptr]);
++ptr;
}
}
for(int i=ptr;i<n;++i)
{
if(nums[i]==1)
{
swap(nums[i],nums[ptr]);
++ptr;
}
}
}
};