目录
颜色分类
题目解析

算法原理

代码
class Solution
{
public:
void sortColors(vector<int>& nums)
{
int left = -1,i = 0,right = nums.size();
while(i < right)
{
if(nums[i] == 0)
swap(nums[++left],nums[i++]);
else if(nums[i] == 1)
i++;
else
swap(nums[--right],nums[i]);
}
}
};
排序数组
题目解析

算法原理

代码
class Solution
{
public:
int func(vector<int>& nums,int l,int r)
{
int k = rand();
return nums[k % (r - l + 1) + l];
}
void qsort(vector<int>& nums,int l,int r)
{
if(l >= r)
return;
int key = func(nums,l,r);
int i = l,left = l-1,right = r + 1;
while(i < right)
{
if(nums[i] < key) swap(nums[++left],nums[i++]);
else if(nums[i] == key) i++;
else swap(nums[--right],nums[i]);
}
qsort(nums,l,left);
qsort(nums,right,r);
}
vector<int> sortArray(vector<int>& nums)
{
srand(time(NULL));
qsort(nums,0,nums.size()-1);
return nums;
}
};
数组中第K个最大元素
题目解析

算法原理

代码
class Solution
{
public:
int Selectnums(vector<int>& nums,int left,int right)
{
int r = rand();
return nums[r % (right - left + 1) + left];
}
int qsort(vector<int>& nums,int left,int right,int k)
{
if(left == right)
return nums[left];
int key = Selectnums(nums,left,right);
int i = left,l = left - 1,r = right + 1;
while(i < r)
{
if(key == nums[i]) i++;
else if(key > nums[i]) swap(nums[++l],nums[i++]);
else swap(nums[--r],nums[i]);
}
int a = l - left + 1;
int b = r - l - 1;
int c = right - r + 1;
if(c >= k)
return qsort(nums,r,right,k);
else if((b+c) >= k)
return key;
else
return qsort(nums,left,l,k - b - c);
}
int findKthLargest(vector<int>& nums, int k)
{
srand(time(NULL));
int n = nums.size();
return qsort(nums,0,n-1,k);
}
};
LCR 159. 库存管理 III
题目解析

算法原理

代码
class Solution
{
public:
int GetRound(vector<int>& nums,int left,int right,int k)
{
int r = rand();
return nums[r % (right - left + 1) + left];
}
vector<int> inventoryManagement(vector<int>& stock, int cnt)
{
srand(time(NULL));
qsort(stock,0,stock.size()-1,cnt);
return {stock.begin(),stock.begin()+cnt};
}
void qsort(vector<int>& nums,int l,int r,int k)
{
if(l >= r) return;
int key = GetRound(nums,l,r,k);
int i = l,left = l - 1,right = r + 1;
while(i < right)
{
if(key > nums[i]) swap(nums[++left],nums[i++]);
else if(key == nums[i]) i++;
else swap(nums[--right],nums[i]);
}
int a = left - l + 1,b = right - left - 1,c = r - right + 1;
if(a > k) qsort(nums,l,left,k);
else if(a + b >= k) return;
else qsort(nums,right,r,k - a - b);
}
};