Kth Largest Element in an Array Leetcode

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.

 

这道题拿到的时候没说不让用Arrays.sort我就直接写了。。。需要注意的是这里不支持Collections.reverseOrder()这个comparator。

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length - k];
    }
}

不过这个时间复杂度是O(nlogn)。。。

后来学会了quick selection的方法。思想和quick sort类似,首先取最后一个值为pivot,放到它排序的最终位置去,它左边的值都比它小,它右边的值都比它大。如果这个时候它的index为nums.length - k,说明这个就是要返回的值。否则,如果它的index小于nums.length - k,说明目标值在它的右边,反之在左边。

右边界要考虑一开始最大值就在最后面的情况,这个时候j还是要向左移动的,所以要考虑等于的问题,等于的时候到底要不要移动。

说是shuffle之后时间复杂度就稳定在O(n)了,虽然还是有点疑惑这个时间复杂度。。。以后再回顾一下吧,quick sort, quick select都不好写。。。

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        random(nums);
        int low = 0;
        int high = nums.length - 1;
        k = nums.length - k;
        while (low < high) {
            int j = patition(nums, low, high);
            if (j == k) {
                return nums[k];
            } else if (j > k) {
                high = j - 1;
            } else {
                low = j + 1;
            }
        }
        return nums[k];
    }
    private int patition(int[] nums, int low, int high) {
        int j = high;
        while (low < j) {
            while (low < j && nums[low] < nums[high]){
                low++;
            }
            while (low < j && nums[j] >= nums[high]) {
                j--;
            }
            if (low == j) {
                break;
            }
            swap(nums, low, j);
        }
        swap(nums, high, j);
        return j;
    }
    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
    private void random(int[] nums) {
        Random rd = new Random();
        for (int i = 1; i < nums.length; i++) {
            int index = rd.nextInt(i + 1);
            swap(nums, i, index);
        }
    }
}

 

posted @ 2017-02-15 08:44  璨璨要好好学习  阅读(142)  评论(0编辑  收藏  举报