5. 第k大元素(lintcode)

利用快排的思想。

根据基准值(一般为数组的第一个数)。进行左右划分,比基准小的放到基准值右边,反之放左边(因为是第k大,所以逆序,也可以是顺序,想顺序的话下面就反着看)。

左右划分后,有三种情况

1、基准值下标大于k,进行递归,在 0 - (基准值小标 - 1)范围找第k大元素

2、基准值下标小于k,进行递归,在(基准值小标 + 1)- n 范围找第(k - (基准值下标 + 1))大元素

3、基准值下标等于k,那么基准值就是k

代码:

public int kthLargestElement(int k, int[] nums) {
    if(k<1 || k >nums.length){
        return -1;
    }
    return getKthLargestElementByQuickSort(nums.length-k+1, nums, 0, nums.length-1);
}

private int getKthLargestElementByQuickSort(int k, int[] nums, int start, int end) {
    int left = start, right = end;
    //基值
    int t = nums[left];
    while (left < right) {

        while (nums[right] > t && left < right)
            right--;

        if (left < right)
            nums[left++] = nums[right];

        while (nums[left] < t && left < right)
            left++;

        if (left < right)
            nums[right--] = nums[left];
    }
    nums[left] = t;
    //基值为当前区间数组的第pos大数
    int pos = left-start+1;
    if (pos == k) { //基值就是结果
        return nums[left];
    } else if (pos > k) { //因为比基值小的数的数量大于k,所以k在基值左边
        return getKthLargestElementByQuickSort(k, nums, start, left - 1);
    } else {    //反之,基值在右,且问题转变为求k-pos
        return getKthLargestElementByQuickSort(k-pos, nums, left + 1, end);
    }
}   

效率分析:

算法的效率和快排的有点像,当基准值每次都在最中间,效率最好,为

n + n/2 + n/4 + ... + n/n = (1 + 1/2 + 1/4 + ... ) * n = (2 - (1/2)n) * < 2n;

所以算法的最好效率是 o(2n) = o(n);

当数组每次都需要把右边的数放到左边(也就是每次基准值最小),且k = 1,算法的最坏效率

n + (n - 1) + (n - 2) + ... + 1 = (1 + n) * n / 2 = 1/2 * n^2 + 1/2 * n

所以算法最坏效率为o(n ^ 2)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,362评论 0 3
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,771评论 0 33
  • 1.攒10万块钱 2.找个男朋友 3.完成业绩任务
    柠檬兔博士阅读 297评论 0 0
  • 人的一生都在寻找资源,积累资源,期望资源能创造奇迹,达到各种目标。 实际上,善用资源,整合资源,意义会大些。此处的...
    聂正刚阅读 252评论 0 0
  • 曾几何时,《读者文摘》雄霸全国报刊之首。 令椰菜君略感自得的是,虽然家住八线小县城,但除了创刊头几期错过之外,椰菜...
    椰菜君阅读 1,105评论 2 0