Kth Largest Element II Lintcode

Find K-th largest element in an array. and N is much larger than k.

 Notice

You can swap elements in the array

Example

In array [9,3,2,4,8], the 3rd largest element is 4.

In array [1,2,3,4,5], the 1st largest element is 52ndlargest element is 43rd largest element is 3 and etc.

这道题可以用快速排序/快速选择的思想来做。

快排也写了不止一次了,但还是不够熟练。。。希望经过这次练习可以熟练一些。

需要注意的是注释的地方是不需要右边向左移动的,因为需要右边的指针停在第一个比pivot大的数的位置上,这样才可以调换。

class Solution {
    /**
     * @param nums an integer unsorted array
     * @param k an integer from 1 to n
     * @return the kth largest element
     */
    public int kthLargestElement2(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        if (nums.length == 1 && k == 1) {
            return nums[0];
        } else if (nums.length == 1) {
            return -1;
        }
        int result = helper(nums, 0, nums.length - 1, nums.length - 1, k);
        return result;
    }
    private int helper(int[] nums, int left, int right, int pivot, int k) {
        int l = left, r = right;
        while (l < r) {
            while (l < r && nums[l] > nums[pivot]) {
                l++;
            }
            while (l < r && nums[r] <= nums[pivot]) {
                r--;
            }
            swap(nums, l, r);
            l++;
            // r--;
        }
        swap(nums, r, pivot);
        if (r == k - 1) {
            return nums[r];
        } else if (r < k - 1) {
            return helper(nums, r + 1, right, pivot, k);
        }
        return helper(nums, left, r - 1, r - 1, k);
    }
    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

还可以用heap来做,可能相对慢一点?因为要全部排序?但这个思路要反应一下。。。到时候回顾回顾?

class Solution {
    /**
     * @param nums an integer unsorted array
     * @param k an integer from 1 to n
     * @return the kth largest element
     */
    public int kthLargestElement2(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(k);
        for (int i = 0; i < nums.length; i++) {
            pq.offer(nums[i]);
            if (pq.size() > k) {
                pq.poll();
            }
        }
        return pq.peek();
    }
}

 

posted @ 2017-04-13 08:01  璨璨要好好学习  阅读(317)  评论(0编辑  收藏  举报