运行超时:LeetCode215 数组中的第K个最大元素
来源:3-5 三路快排partition思路的应用 Sort Color
阿阳2017
2024-01-23
老师好,我在用快排的方法找到第K大的元素时,在本地运行没什么问题,但是提交到LeetCode的时候,有一个测试用例,前面的数据都是大量的1,后面有几个不一样,这样运行下来就超时了。代码如下:
class Solution {
private:
int partition(vector<int> &arr, int l, int r) {
int p = l + rand() %(r - l + 1); // [p, r)
swap(arr[l], arr[p]); // pivot放在最左端arr[l]
// 注意是从大到小的分区,所以前面区间的数大于后面区间的数
int lt = l+1; // [l+1...lt) > p ; [lt...i) < p
for(int i = l + 1; i <= r; i++)
if(arr[i] > arr[l])
swap(arr[i], arr[lt++]);
swap(arr[l], arr[lt-1]);
return lt-1;
}
int findKthLargest(vector<int>& nums, int l, int r, int k) {
if( l == r)
return nums[l];
int p = partition(nums, l, r);
if(p == k)
return nums[p];
else if( k < p)
return findKthLargest(nums, l, p-1, k);
else {
assert(k > p);
return findKthLargest(nums, p+1, r, k);
}
}
public:
int findKthLargest(vector<int>& nums, int k) {
assert(nums.size() > 0 && k > 0 && k <= nums.size());
srand(time(NULL));
return findKthLargest(nums, 0, nums.size()-1, k-1); //k-1是为了和数组下标一致
}
};
测试用例截图如下:
猜想可能是单路快排处理这种大量重复元素的情况比较慢。
写回答
1回答
-
liuyubobobo
2024-01-24
你的快排是单路快排。
对于有大量重复元素的情况,单路快排将退化到 O(n^2),所以是的需要使用双路快排。
继续加油!:)
00
相似问题