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 };  

评测系统上运行结果:

 

posted @ 2017-02-27 15:46  小谷子的博客园  阅读(137)  评论(0编辑  收藏  举报