leetcode Kth Largest Element in an Array
来源:互联网 发布:淘宝双11海报素材 编辑:程序博客网 时间:2024/05/21 19:36
Kth Largest Element in an Array
题目详情:
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大于右边数组的大小,并且k小于或等于与它相等的数组的大小和右边数组大小之和,则第k大的数就是这个数。如果k大于与它相等的数组的大小和右边数组大小之和,则在左边数组寻找第(k-与它相等的数组的大小-右边数组的大小)大的数。
这是分治算法的经典例子。注意每次可以随机取数组中的数,或者是取数组中间的数,如果取数组第一个数或者是最后一个数,容易出现极端情况。
详细代码:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return select(nums, k);
}
int select(vector<int>& array, int k) {
if (array.size() > 0) {
int com = array[array.size()/2];
vector<int> left;
vector<int> right;
for (vector<int>::iterator iter = array.begin(); iter != array.end(); ++iter) {
if (*iter > com) {
right.push_back(*iter);
iter = array.erase(iter);
--iter;
} else if (*iter < com) {
left.push_back(*iter);
iter = array.erase(iter);
--iter;
}
}
if (k <= right.size()) {
return select(right, k);
} else if (k <= (right.size() + array.size()) && k > right.size()) {
return array[0];
} else if (k > (right.size()+array.size())) {
return select(left, k-right.size()-array.size());
}
} else {
return 0;
}
}
};
public:
int findKthLargest(vector<int>& nums, int k) {
return select(nums, k);
}
int select(vector<int>& array, int k) {
if (array.size() > 0) {
int com = array[array.size()/2];
vector<int> left;
vector<int> right;
for (vector<int>::iterator iter = array.begin(); iter != array.end(); ++iter) {
if (*iter > com) {
right.push_back(*iter);
iter = array.erase(iter);
--iter;
} else if (*iter < com) {
left.push_back(*iter);
iter = array.erase(iter);
--iter;
}
}
if (k <= right.size()) {
return select(right, k);
} else if (k <= (right.size() + array.size()) && k > right.size()) {
return array[0];
} else if (k > (right.size()+array.size())) {
return select(left, k-right.size()-array.size());
}
} else {
return 0;
}
}
};
复杂度分析:
T(n)= T(n/2)+ O(n) 为nlogn
代码中需要注意的问题:
vector中erase一个元素,它的iiterate指向的是下一个元素的iterate,所以删除完之后,要--iter。
阅读全文
0 0
- Leetcode 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
- [leetcode] 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
- 【Leetcode】Kth Largest Element in an Array
- Leetcode: Kth Largest Element in an Array
- Kth Largest Element in an Array -- leetcode
- [Leetcode]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
- LeetCode Kth Largest Element in an Array
- leetcode-Kth Largest Element in an Array
- LeetCode -- Kth Largest Element in an Array
- window.opener方法的使用 js跨域
- MAC上编写汇编程序
- 大学生职业规划
- 【bzoj3036】绿豆蛙的归宿
- ajax原理过程 同步与异步区别 优缺点
- leetcode Kth Largest Element in an Array
- 设计模式-行为-命令
- POJ 3281 Dining 笔记
- const int * 与 int * const等的区别
- Java程序员从笨鸟到菜鸟之(三)类与对象
- linux设备驱动模板
- Hibernate各种主键生成策略与配置详解
- JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
- [bzoj-4557][JLoi2016]侦察守卫 题解