手撕代码:
第k大的数组元素,如何降低时间复杂度
要找到数组中第k大的元素,一种高效的方法是使用快速选择算法(QuickSelect)。快速选择算法是快速排序算法的变种,用于在未完全排序的情况下找到第k大(或第k小)的元素。它的平均时间复杂度是O(n),最坏情况下的时间复杂度为O(n^2),但与快速排序相比,它只需要对数组的一部分进行排序,可以显著减少计算时间。
示例:
[pre]#include <vector>
using namespace std;
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[left];
int l = left + 1;
int r = right;
while (l <= r) {
if (nums[l] < pivot && nums[r] > pivot) {
swap(nums[l++], nums[r--]);
}
if (nums[l] >= pivot) l++;
if (nums[r] <= pivot) r--;
}
swap(nums[left], nums[r]);
return r;
}
int quickSelect(vector<int>& nums, int left, int right, int k) {
if (left == right) return nums[left];
int pivotIndex = partition(nums, left, right);
// 第k大,转换为第 len-k 小的问题。
if (k == pivotIndex) return nums[k];
else if (k < pivotIndex) return quickSelect(nums, left, pivotIndex - 1, k);
else return quickSelect(nums, pivotIndex + 1, right, k);
}
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
// 第k大的数在倒序排列的位置为 n-k
return quickSelect(nums, 0, n - 1, n - k);
顺便吆喝一句,民族企业大厂,[url=https://jsj.top/f/o38ijj]前后端测试[/url]捞人,感兴趣的来!