LintCode 606.第K大的元素Ⅱ

找到数组中第K大的元素,N远大于K。请注意你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素

Partition
随机选取一个数组元素pivot 将数组分成两部分 左边小于pivot 右边大于pivot
看k落在哪段区间上 对这段区间继续partition
直到pivot的位置与k相同 返回pivot

public 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 < k || nums.length == 0)
            return -1;
        return helper(nums.length - k + 1, nums, 0, nums.length - 1);
    }
    private int helper(int k, int[] nums, int l, int r){
        if(l == r)
            return nums[l];
        int position = partition(nums, l, r);
        if(position + 1 == k)
            return nums[position];
        else if(position + 1 > k)
            return  helper(k, nums, l, position - 1);
        else
            return helper(k, nums, position + 1, r);
    }
    private int partition(int[] nums, int l, int r){
        int left = l, right = r;
        int pivot = nums[left];
        while(left < right){
            while(left < right && nums[right] >= pivot){
                right--;
            }
            nums[left] = nums[right];
            while(left < right && nums[left] <= pivot){
                left++;
            }
            nums[right] = nums[left];
        }
        nums[left] = pivot;
        return left;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值