classSolution { public: intfindKthLargest(vector<int>& nums, int k){ srand(time(NULL)); int n = nums.size(), l = 0, r = n - 1; while (l <= r) { int m = partition(nums, l, r); if (m == k - 1) return nums[m]; if (m < k - 1) { l = m + 1; } else { r = m - 1; } } return-1; }
intpartition(vector<int> &A, int l, int r){ vector<int> v{l, l + (r - l) / 2, r}; swap(A[l], A[v[rand() % 3]]); int j = l + 1; // 从pivot下一个开始 for (int i = j; i <= r; ++i) { if (A[i] > A[l]) { swap(A[i], A[j++]); // 凡是比pivot大的就往前换 } } swap(A[--j], A[l]); // 拿最后一个比pivot大的跟pivot交换 return j; } };
classSolution { public: intfindKthLargest(vector<int>& nums, int k){ srand((unsigned)time(NULL)); int n = nums.size(); int l = 0, r = n - 1; while (l <= r) { int i = partition(nums, l, r); if (i == k - 1) return nums[i]; if (i > k - 1) { r = i - 1; } else { l = i + 1; } } return-1; }
intpartition(vector<int> &nums, int l, int r){ vector<int> v{l, (l + r) / 2, r}; swap(nums[l], nums[v[rand() % 3]]); int pivot = nums[l]; while (l < r) { while (l < r && nums[r] <= pivot) { // 因为是求第k大所以要降序 --r; } nums[l] = nums[r]; while (l < r && nums[l] >= pivot) { ++l; } nums[r] = nums[l]; } nums[l] = pivot; return l; } };
classSolution { public: intfindKthLargest(vector<int>& nums, int k){ int n = nums.size(); int l = 0, r = n - 1; // 左右闭区间 while (l <= r) { // 要考虑l == r的情况 auto i = partition(nums, l, r); if (i == k - 1) { // k是从1开始的 return nums[i]; } elseif (i < k - 1) { l = i + 1; } else { r = i - 1; } } }
intpartition(vector<int> &nums, int left, int right){ int pivot = nums[left]; int l = left, r = right; while (l < r) { while (l < r && nums[r] <= pivot) --r; nums[l] = nums[r]; while (l < r && nums[l] >= pivot) ++l; nums[r] = nums[l]; } nums[l] = pivot; return l; } };