LeetCode215. Kth Largest Element in an Array(Medium)

来源:互联网 发布:玩转财务大数据 编辑:程序博客网 时间:2024/05/17 06:34

原题地址: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

原创粉丝点击