leetcode Kth Largest Element in an Array

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

复杂度分析:

T(n)= T(n/2)+ O(n) 为nlogn

代码中需要注意的问题:

vector中erase一个元素,它的iiterate指向的是下一个元素的iterate,所以删除完之后,要--iter。

猜你喜欢

转载自blog.csdn.net/weixin_40085482/article/details/78171334