zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    LeetCode344
    LeetCode18四数之和扩展N数之和
    LeetCode383赎金信
    2018-2020创业总结
    LeetCode454四数相加
    普通dll项目添加WPF的Window对象
    WPF中RadioButton的数据绑定
    02 C# 文件压缩与解压
    WPF 使用附加属性声明 ICommand
    自定义WPF分页控件
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/10460814.html
Copyright © 2011-2022 走看看