【leetcode】215. Kth Largest Element in an Array

题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

解法1

时间复杂度:O(nlogn)
思路:使用快速排序,将数组排序,然后找到第k个最大的元素。这里需要复习一下快速一下快速排序的实现方法。
https://blog.csdn.net/A_BlackMoon/article/details/81064712

int partition(vector<int> &vec, int left, int right)
{
    int base = vec[left];
    while(left < right)
    {
        while(vec[right] >= base && left < right)
            right --;
        swap(vec[left], vec[right]);
        while(vec[left] <= base && left < right)
            left ++;
        swap(vec[left], vec[right]);
    }

    return left;
}
 int fast_sort(vector<int> &vec, int left, int right)
{
     if (left < right)
     {
         int point = partition(vec, left, right);
         fast_sort(vec, left, point - 1);
         fast_sort(vec, point + 1, right);
     }
     return 0;
}

int findKthLargest(vector<int> &nums, int k)
{
    if (k > nums.size())
        return 0;
    fast_sort(nums, 0, nums.size() - 1);
    return nums[nums.size() - k];
}

解法2

时间复杂度:O(nlogn)
思路:直接使用sort库函数进行排序。

int findKthLargest(vector<int> &nums, int k)
{
    if (k > nums.size())
        return 0;
    sort(nums.begin(), nums.end());
    return nums[nums.size() - k];
}

解法3

时间复杂度:O(nlogn)
思路:利用快排的思想,所获取的patiton即已经排好序的位置,将其与倒数第k的位置作比较。
若相等,则正好是所求的第k大位置;
若小于,则继续对[patition + 1, high]求patition;
若大于,则继续对[low, patition - 1]求pattion。

int partition(vector<int> &vec, int left, int right)
{
    int base = vec[left];
    while(left < right)
    {
        while(vec[right] >= base && left < right)
            right --;
        swap(vec[left], vec[right]);
        while(vec[left] <= base && left < right)
            left ++;
        swap(vec[left], vec[right]);
    }

    return left;
}

int findKthLargest(vector<int> &nums, int k)
{
    if (k > nums.size())
        return 0;
    int point = 0;
    int low = 0, high = nums.size() - 1;
    int dest = nums.size() - k;
    while(1)
    {
        point = partition(nums, low, high);
        if (point == dest)
            return nums[dest];
        else if (point > dest)
            high = point - 1;
        else
            low = point + 1;
    }
    return 0;
}
posted @ 2019-03-06 10:19  JESSET  阅读(172)  评论(0编辑  收藏  举报