class Solution {
public:
void sortColors(vector<int>& nums) {
int left = -1, right = nums.size();
int i = 0;
while (i < right) {
if (nums[i] == 0)
swap(nums[++left], nums[i++]);
else if (nums[i] == 1)
i++;
else
swap(nums[--right], nums[i]);
}
}
};
如果b + c >= k,那第k个最大的元素一定就是key(区间[left+1 , right-1]是=key的)
如果b + c < k,那第k个最大的元素一定在< key的区间中。
对< key区间继续进行快速选择排序即可。(在< key区间中,找第k-b-c个最大的元素)
代码实现
cpp复制代码
class Solution {
public:
void qsort(vector<int>& nums, int l, int r) {
if (l >= r)
return;
int key = nums[l + rand() % (r - l + 1)];
int left = l - 1, right = r + 1;
int i = l;
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> inventoryManagement(vector<int>& stock, int cnt) {
srand(time(NULL));
qsort(stock, 0, stock.size() - 1);
vector<int> ret(cnt, 0);
for (int i = 0; i < cnt; i++)
ret[i] = stock[i];
return ret;
}
};
class Solution {
public:
void qsort(vector<int>& nums, int l, int r) {
if (l >= r)
return;
int key = nums[l + rand() % (r - l + 1)];
int left = l - 1, right = r + 1;
int i = l;
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> inventoryManagement(vector<int>& stock, int cnt) {
srand(time(NULL));
qsort(stock, 0, stock.size() - 1);
vector<int> ret(cnt);
for (int i = 0; i < cnt; i++)
ret[i] = stock[i];
return ret;
}
};