zoukankan      html  css  js  c++  java
  • 215. Kth Largest Element in an Array

    题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/?tab=Description

    题目大意:给定一个未排序的数组,找出数组中第k大的数。举个例子数组nums为[3,2,1,5,6,4],k=2,则返回5.

    思路:(1) 对数组进行降序排序后返回数组的第k-1个元素

            (2) 利用快速排序的思想,从数组nums中随机找出一个元素X,把数组分为两部分small和large。large中的元素大于等于X,small中元素小于X。这时有两种情况:
                 1. large中元素的个数小于k,则small中的第k-|large|个元素即为第k大数;
                 2. large中元素的个数大于等于k,则返回large中的第k大数。时间复杂度近似为O(n)

    算法步骤:

    (1) 1、对数组进行快速排序(升序);2、返回数组的倒数第k个元素

    (2) 1、初始化数组左右边界,l=0,r=nums.size()-1,初始化分割数pivot=nums[l];2、划分数组,把大于等于pivot的数分到左侧,小于pivot的数分到右侧,并返回pivot的下标index;3、如果index==k-1,则pivot即为第K大的数,返回pivot,若index<k-1,说明第k大的数在右侧,更新l=index+1,否则第k大的值在左侧,更新r=index-1;4、根据新的数组边界,重新划分数组。

    算法复杂度:

    (1) 时间复杂度O(nlog(n)),空间复杂度O(1)

    (2) 时间复杂度O(n),空间复杂度O(1)

    (1)

    1 #include <algorithm>  
    2   
    3 class Solution {  
    4 public:  
    5     int findKthLargest(vector<int>& nums, int k) {  
    6         std::sort(nums.begin(), nums.end());  
    7         return nums[nums.size() - k];  
    8     }  
    9 };  

    (2)

     1 class Solution {  
     2 public:  
     3     int findKthLargest(vector<int>& nums, int k) {  
     4         int l = 0, r = nums.size() - 1;  
     5         --k;  
     6         int index = 0;  
     7         while (l <= r) {  
     8             index = partition(nums, l, r);  
     9             if (index > k)  
    10                 r = index - 1;  
    11             else if (index < k)  
    12                 l = index + 1;  
    13             else  
    14                 return nums[index];  
    15         }  
    16     }  
    17     int partition(vector<int>& nums, int l, int r) {  
    18         int pivot = nums[l];  
    19         while (l < r) {  
    20             while (l < r && nums[r] < pivot)  
    21                 --r;  
    22             nums[l] = nums[r];  
    23             while (l < r && nums[l] >= pivot)  
    24                 ++l;  
    25             nums[r] = nums[l];  
    26         }  
    27         nums[l] = pivot;  
    28         return l;  
    29     }  
    30 };  

    评测系统上运行结果:

  • 相关阅读:
    LeetCode124 二叉树中的最大路径和
    LeetCode100 相同的树
    LeetCode206 反转链表
    LeetCode460 LFU缓存
    LeetCode876 链表的中间结点
    hdu2767 强连通分量
    hdu1827 强连通分量
    模板 tarjan算法
    hdu2227 树状数组优化dp
    割点和桥
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6474498.html
Copyright © 2011-2022 走看看