i007.cc

i007.cc

优先队列-降维打击

王争的快排分区方法真简洁

int Patition(vector<int>& v, int begin, int end) {
    int& pivot = v[end];
    int done = begin;
    for (int i = begin; i < end; ++i) {
        if (v[i] < pivot) {
            std::swap(v[i], v[done]);
            done++;
        }
    }
    std::swap(v[done], pivot);
    return done;
}

 

获得第几大元素

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        if (k <= 0 || k > nums.size()) {
            throw "wrong input";
        }

        return findKthLargest(nums, 0, nums.size() - 1, k);
    }

    int findKthLargest(vector<int>& nums, int begin, int end, int k) {
        if (begin >= end)
            return nums[begin];

        int pivot = patition(nums, begin, end);
        if (pivot == k - 1) {
            return nums[pivot];
        } else if (pivot > k - 1) {
            return findKthLargest(nums, begin, pivot - 1, k);
        } else {
            return findKthLargest(nums, pivot + 1, end, k);
        }
    }

    int patition(vector<int>& nums, int begin, int end) {
        int rand_pos = begin + rand() % (end - begin + 1);
        if (rand_pos != end)
            std::swap(nums[end], nums[rand_pos]);

        int& pivot = nums[end];
        int done = begin;
        for (int i = begin; i < end; ++i) {
            if (nums[i] > pivot) {
                std::swap(nums[i], nums[done]);
                done++;
            }
        }

        std::swap(nums[done], pivot);
        return done;
    }
};

 

发表回复