您的位置:首页 > 其它

leetcode Kth Largest Element in an Array

2017-10-07 20:19 344 查看

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.
8d0c
size()-array.size());

            }

        } else {

            return 0;

        }

    }

};

复杂度分析:

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

代码中需要注意的问题:

vector中erase一个元素,它的iiterate指向的是下一个元素的iterate,所以删除完之后,要--iter。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: