Kth Largest Element in an Array
来源:互联网 发布:api接口程序源码 编辑:程序博客网 时间:2024/06/18 09:25
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4]
and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
解题思路:
求一个未排序的数组的第k大的值,其中相同大小的仍然计算大小。并非是不同的第k大的值。
方法一:
我们将数组直接排序,第k大的值也就是下标为n-k的值,代码如下:
</pre><pre name="code" class="cpp">class Solution {public: int findKthLargest(vector<int>& nums, int k) { if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; sort(nums.begin(),nums.end()); return nums[nums.size()-k]; }};
方法二:
我们借鉴快速排序的思想,将数组分成两部分,前部分小与key值,后部分大于key值,第k大的值就是第n-k+1小的值,也就是前半部分的大小为n-k+1的时候,我们的返回值就是此时的nums[n-k]值,此时前半部分的最大下标为n-k(下标从0开始的)。一旦找到前半部分满足如此条件,我们就直接返回nums[n-k],不用继续进行下面的排序工作,代码如下:
class Solution {public: int findKthLargest(vector<int>& nums, int k) { if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; int low=0,high=nums.size()-1; while(low<high) { int l=low; int h=high; int prio=nums[low]; while(l<h) { while(l<h&&nums[h]>prio) h--; swap(nums[h],nums[l]); while(l<h&&nums[l]<=prio) l++; swap(nums[h],nums[l]); } nums[l]=prio; if(l==nums.size()-k) return nums[nums.size()-k]; else if(l>nums.size()-(k)) high=l-1; else low=l+1; } return nums[nums.size()-(k)]; }};
方法三:
同方法二类似,不同的是我们不用由小到大排序,我们从大到小排序,这样更直观。代码如下:
class Solution {public: int findKthLargest(vector<int>& nums, int k) { if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; int low=0,high=nums.size()-1; while(low<high) { int l=low; int h=high; int prio=nums[low]; while(l<h) { while(l<h&&nums[h]<prio) h--; swap(nums[h],nums[l]); while(l<h&&nums[l]>=prio) l++; swap(nums[h],nums[l]); } nums[l]=prio; if(l==k-1) return nums[k-1]; else if(l>k-1) high=l-1; else low=l+1; } return nums[k - 1]; }};
优缺点分析:
利用快排的思想,平均时间复杂度O(n),4ms AC。
直接sort是O(n*log(n))
0 0
- Kth Largest Element in an Array
- Leetcode Kth Largest Element in an Array
- Kth Largest Element in an Array
- Kth Largest Element in an Array
- Leetcode: Kth Largest Element in an Array
- LeetCode Kth Largest Element in an Array
- [LeetCode] Kth Largest Element in an Array
- Kth Largest Element in an Array
- [leetcode] Kth Largest Element in an Array
- Kth Largest Element in an Array
- Kth Largest Element in an Array
- leetcode--Kth Largest Element in an Array
- Kth Largest Element in an Array
- 215.Kth Largest Element in an Array
- #leetcode#Kth Largest Element in an Array
- LeetCode Kth Largest Element in an Array
- LeetCode215:Kth Largest Element in an Array
- Kth Largest Element in an Array
- hdu 3572 Task Schedule(最大流)
- 事务提交与XLog日志分析
- POJ 3414 Pots BFS
- 【Nginx-反向代理服务器】基础知识(一)之事件处理机制
- AndroidAnnotations--提高开发效率的利器
- Kth Largest Element in an Array
- 双链表的建立
- c语言 实现字符串和数字的连接
- 从外围了解UE4
- POJ 3268 Silver Cow Party (存逆图+两次dijkstra求解)
- 数据结构基础 排序算法(一) 概念篇
- hdu5135 Little Zu Chongzhi's Triangles(DP)
- 经典数据结构和算法回顾
- java中的setActionCommand()方法