classSolution { public: intquick_select(vector<int>& nums, int l, int r, int k) { if (l >= r) return nums[l];
int i = l - 1, j = r + 1, x = nums[l + r >> 1]; // x 建议选 nums[l + r >> 1] while (i < j) { do i++; while (nums[i] > x); // 左边均是 >= x的,从大到小排序 do j--; while (nums[j] < x); // 右边均是 <= x的,但是代码里要写成 < x; if (i < j) swap(nums[i], nums[j]); }
int sl = j - l + 1; // 递归一侧 if (k <= sl) returnquick_select(nums, l, j, k); elsereturnquick_select(nums, j + 1, r, k - sl); }
intfindKthLargest(vector<int>& nums, int k){ returnquick_select(nums, 0, nums.size()-1, k); } };
classSolution { public: intquick_select(vector<int>& nums, int l, int r, int k) { // 用while循环 while (true) { if (l >= r) return nums[l];
int i = l - 1, j = r + 1, x = nums[l + r >> 1]; // x 建议选 nums[l + r >> 1] while (i < j) { do i++; while (nums[i] > x); // 左边均是 >= x的,从大到小排序 do j--; while (nums[j] < x); // 右边均是 <= x的,但是代码里要写成 < x; if (i < j) swap(nums[i], nums[j]); }
int sl = j - l + 1; if (k <= sl) r = j; // 更新参数r else // 实测,先更新k要快些 k = k - sl, l = j + 1; // 先更新k再更新l,因为k用到了原来的l,不过我这里用sl保存了,按理说先更新l也可以 } }
intfindKthLargest(vector<int>& nums, int k){ returnquick_select(nums, 0, nums.size()-1, k); } };