运行超时: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),所以是的需要使用双路快排。


继续加油!:)


0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程