题目:题目链接
按照我们一贯的唯一的做法暴力是可以的。就是调用个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的。
加油!!