leetcode215. Kth Largest Element in an Array

题目:题目链接

按照我们一贯的唯一的做法暴力是可以的。就是调用个sort函数直接排就完了,直接AC。但这可是mid啊,这是不是太简单了。no,no,no,我们再想一想。sort的复杂度是O(nlogn)。我记得在学快速排序的时候有提到过,根据快速排序中划分的原则可以O(n)去求解中位数,那中位数是第n/2个数,第k大不就是k-1个数吗。
完美,好想法!翻出我原来写的查找中位数O(n)的写法:代码。(这可是两年前的代码了,荒废了这么久啊,怪不得我这么菜啊。。。。。。。)咱们把上面代码修改一下不就有这题的答案了吗。上代码:


class Solution {
public:
	const int ERROR = -1;
	int findKthLargest(vector<int>& nums, int k) {
		int left = 0, right = nums.size() - 1;
		while (true) {/*找到才退出*/
			int l = left, r = right;
			/*快速排序中划分元素的步骤,不理解代码找个样例直接模拟一下就知道了。*/
			int tmp = nums[l];
			while (l < r) {
				while (l < r && nums[r] <= tmp) r--;
				nums[l] = nums[r];
				while (l < r && nums[l] > tmp) l++;
				nums[r] = nums[l];
			}
			nums[l] = tmp;
			/*以上是快速排序划分元素的代码。*/
			if (l == k - 1) return nums[l];/*对了,万事大吉*/
			else if (l > k - 1) {/*主元序号大于k,就修改上界*/
				right = l - 1;
			}
			else if (l < k - 1) {/*主元序号小于k,就修改下界*/
				left = l + 1;
			}
		}/*while (l < r) */
		return ERROR;
	}/*while(true)*/
	/*如果不知道快排的先去看看快排。别怕,怕永远学不会。*/
};

最后提一嘴,其实这样时间比直接sort要久,我认为应该是快速排序的最坏情况导致。其平均时间复杂度肯定是优于sort的。
加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值