目录
颜色分类
题目解析
算法原理
代码
class Solution
{
public:
void sortColors(vector<int>& nums)
{
// 三指针,数组分成三块
int left = -1,i = 0,right = nums.size();
// i == right结束循环
// 0 1 2 left边缘到右边 right边缘到左边
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();
// 保证选数在[l,r]之间
return nums[k % (r - l + 1) + l];
}
void qsort(vector<int>& nums,int l,int r)
{
// 有空数组和1个数的数组的情况
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]);
}
// 递归
// [l,left] [left + 1,right - 1] [right,r]
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)
{
//返回条件
// 只有一个元素
// 没有空数组的情况因为要找第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]);
}
// 递归
// [left,l] [l+1,r-1] [r,right]
// [0,l++] [r--,n-1]
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};
// int n = stock.size();
// sort(stock.begin(),stock.end());
// vector<int> ret;
// int i = 0;
// while(cnt--)
// {
// ret.push_back(stock[i++]);
// }
// return ret;
}
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]);
}
// [l,left] [left + 1,right - 1] [right,r]
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);
}
};