classSolution { public: voidsortColors(vector<int>& nums) { int n = nums.size(); int left = -1, right = n, i = 0; while (i < right) { if (nums[i] == 0) { swap(nums[++left], nums[i++]); } elseif(nums[i] == 2) { swap(nums[--right], nums[i]); } else { i++; } } } };
voidqsort(vector<int>& nums, int l, int r) { if (l >= r) return; int key = getRandom(nums, l, r); int i = l, left = l - 1, right = r + 1; while (i < right) { if (nums[i] < key) { swap(nums[++left], nums[i++]); } elseif (nums[i] > key) { swap(nums[--right], nums[i]); } else { i++; } } qsort(nums, l, left); qsort(nums, right, r); }
intgetRandom(vector<int>& nums, int left, int right) { int r = rand(); return nums[r % (right - left + 1) + left]; } };
intqsort(vector<int> nums, int l, int r, int k) { if (l == r) return nums[l]; int key = getRandom(nums, l, r); int left = l - 1, right = r + 1, i = l; while (i < right) { if (nums[i] < key) { swap(nums[++left], nums[i++]); } elseif (nums[i] > key) { swap(nums[--right], nums[i]); } else { i++; } }
int c = r - right + 1, b = right - left - 1; if (c >= k) { returnqsort(nums, right, r, k); } elseif (c + b >= k) { return key; } else { returnqsort(nums, l, left, k - b - c); } }
intgetRandom(vector<int> nums, int left, int right) { int r = rand(); return nums[r % (right - left + 1) + left]; } };
voidqsort(vector<int>& stock, int l, int r, int cnt) { if (l >= r) return; int key = getRandom(stock, l, r); int left = l - 1, right = r + 1, i = l; while (i < right) { if (stock[i] < key) { swap(stock[++left], stock[i++]); } elseif (stock[i] > key) { swap(stock[--right], stock[i]); } else { i++; } }
int a = left - l + 1, b = right - left - 1; if (a > cnt) { returnqsort(stock, l, left, cnt); } elseif (a + b >= cnt) { return; } else { returnqsort(stock, right, r, cnt - b - a); } }
intgetRandom(vector<int>& stock, int l, int r) { return stock[rand() % (r - l + 1) + l]; } };