求数组中第K大的数

题目内容

  有N个整数,请找到其中最大的第K个数。

求解方法

  注意,这里题目不是topK问题,但是完全可以利用topK问题来解决。但是从算法上来说,求的是第K大的数,而计算的是前K大的数,必然是进行了额外的计算。这里给出一种基于快速排序的求解第K大数的算法。

	public int findKthNum(int[] array, int left, int right, int k) {
		int j = partition(array, left, right);
		int target = left + k - 1;
		if (j == target)
			return array[j];
		else if (j > target)
			return findKthNum(array, left, j - 1, k);
		else
			return findKthNum(array, j + 1, right, k - (j - left + 1));
	}

	public int partition(int[] array, int left, int right) {
		int j = left;
		int index = getRandom(left, right);
		for (int i = left; i <= right; i++) {
			if (i != index && array[i] < array[index]) {
				int temp = array[j];
				array[j] = array[i];
				array[i] = temp;
				j++;
			}
		}
		int temp = array[j];
		array[j] = array[index];
		array[index] = temp;
		return j;
	}

	public int getRandom(int left, int right) {
		double index = Math.random();
		return (int) (index * (right - left) + left);
	}
复制代码

转载于:https://juejin.im/post/5c25983d6fb9a049dd805ab1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值