Kth|Kth Largest Element in an Array 数组中第k大的数字
前言: 头条面试题目, 当时没想出来,现在回想起来如果熟悉快速排序的话也就是分分钟的事情了。不过头条真心重视算法,基本是算法牛逼就铁定过。
在最短的时间内找到第k大数
- 思路: 快速排序 + 舍弃一半方法,时间复杂度为O(nlogn)
package com.protobuf.ACM;
/**
* Created by liuchaoqun01 on 2019/1/12.
*/
public class Klarge {/**
* 寻找第k大数,时间复杂度为: O(nlogn)
* @param a
* @param low
* @param high
* @param k
* @return
*/
public static int getLeftArray (int[] a, int low, int high, int k) {
int i,j,index;
if(low > high) { // 递归截止条件
return-1;
}
index = a[low];
i = low;
j = high;
while (i < j) {
while (i < j && a[j] >= index) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] <= index) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
// final i == j
a[i] = index;
// 找到第k大数
if (i == (k-1)) {
return index;
}
if (i > (k -1)) {
return getLeftArray(a, low, i - 1, k);
} else {
return getLeftArray(a, i + 1, high, k);
}
}/**
* 快速排序: O(nlogn)
*/
public static void sort (int[] a, int low, int high) {
int i, j, index;
if (low > high) { // 递归截止条件
return;
}
index = a[low];
i = low;
j = high;
while (i < j) {
while (i < j && a[j] >= index) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] <= index) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
// final i == j
a[i] = index;
sort(a, low, i - 1);
sort(a, i + 1, high);
}public static void main(String[] args) {
int[] arr = {2,34,1,22,9};
sort(arr, 0, arr.length -1);
int res = getLeftArray(arr, 0, arr.length - 1, 4);
System.out.println(res);
}
}
- 后记
后来发现其实LeetCode中的题目,并且有一道相似的题目,遂记录如下,具体参考2【Kth|Kth Largest Element in an Array 数组中第k大的数字】参考:
1 leetcod: Kth Largest Element in a Stream 数据流中的第K大的元素
2 703. Kth Largest Element in a Stream
推荐阅读
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- LintCode|LintCode 545 [Top k Largest Number II]
- element源码学习二(dev)
- element-ui表单验证例子(validateField验证部分表单)
- 【最棒的讲解】细说element分页
- Spark--java.util.NoSuchElementException:|Spark--java.util.NoSuchElementException: None.get at at
- vue-element-admin登录验证使用
- 练习|vue+element实现手机号验证码注册
- 龙马UI|龙马UI lm-ui-elementl lm-address地址组件
- hackthebox|hackthebox Nineveh