• 【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;
    }
  • 相关阅读:
    MySQL锁
    mysql服务性能优化—my.cnf配置说明详解
    springmvc请求参数获取的几种方法
    Linux mysql 添加远程连接
    Linux 操作 mysql
    Linux 安装 mysql 转 http://www.cnblogs.com/fnlingnzb-learner/p/5830622.html
    linux 下 安装nginx
    dubbo 实战总结
    分布式事务的几种方式
    精巧好用的DelayQueue 转
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/10460814.html
Copyright © 2020-2023  润新知