原题地址:https://leetcode.com/problems/kth-largest-element-in-an-array/description/
题目:
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大的数,解题思路就是用分治法, 做法和书上例题几乎完全一样。将原vector对象nums分成Sl,Sv和Sr。
随机选择一个数v做参考(此处我选择nums[0]),比v大的压入Sl,相等的压入Sv,小的压入Sr。再通过判断各个vector的长度和k的大小比较,选择返回的变量。
如果k <= Sl.size(), 返回 findKthLargest(Sl, k)。
如果Sl.size() < k <= Sl.size()+Sv.size(), 返回v.
如果k > Sl.size()+Sv.size(), 返回findKthLargest(Sr, k- Sl.size()-Sv.size())。
解题思路并不麻烦,但是在judging的过程中,总是提示Memory Limit Exceeded后来发现是因为创建了vector对象却没有在离开作用域时将其清空。然后就是用vector().swap(),将用不到的vector对象释放。但是仍然出现该问题。后来发现题目要求的只是返回第k大的那一个数,所以在每次调用findKthLargest(nums, k)函数时,在分配完三个vector对象后,将nums释放,最后验证没有超出内存限制。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
vector<int> Sl, Sv, Sr; //将原vector分成三份,按从大到小顺序从左到右排序
int v = nums[0]; //随机选择参照数v
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > v) Sl.push_back(nums[i]);
if (nums[i] == v) Sv.push_back(nums[i]);
if (nums[i] < v) Sr.push_back(nums[i]);
}
vector<int>().swap(nums); //分配完成后释放nums
int sizeL = Sl.size(), sizeV = Sv.size(); //因为后面可能要用到Sl和Sv的大小,且
//需要释放Sl和Sv,因此提前记录好他们大小
if (k <= Sl.size()) {
vector<int>().swap(Sr);
vector<int>().swap(Sv);
return findKthLargest(Sl, k);
}
if (Sl.size() < k&&k <= Sl.size() + Sv.size()) {
vector<int>().swap(Sr);
vector<int>().swap(Sl);
vector<int>().swap(Sv);
return v;
}
if (k > Sl.size() + Sv.size()) {
vector<int>().swap(Sv);
vector<int>().swap(Sl);
return findKthLargest(Sr, k - sizeL - sizeV);
}
}
};
31 / 31 test cases passed.
Status: Accepted
Runtime: 149 ms