📅  最后修改于: 2023-12-03 15:28:48.287000             🧑  作者: Mango
本题是门|门IT 2006题库中的第65题,要求编写一个函数从一个数组中找出第n大的数。
要求找出第n大的数,可以考虑排序后取第n个数。但是排序的时间复杂度为O(nlogn),不如直接找出第n大的数的时间复杂度O(n),可以采用快速排序的思想进行查找。
具体来说,可以选择数组中的一个数作为基准,将数组分为比基准小的部分和比基准大的部分。如果比基准大的部分的数量大于等于n,那么继续在比基准大的部分中查找第n大的数。否则,在比基准小的部分中查找第(n-比基准大的数量)大的数。
以下是快速查找第n大数的函数实现,使用C++语言编写:
int quickSelect(vector<int>& nums, int left, int right, int n) {
int p = nums[left], l = left + 1, r = right;
while (l <= r) {
if (nums[l] > p && nums[r] < p) {
swap(nums[l++], nums[r--]);
}
if (nums[l] <= p) {
++l;
}
if (nums[r] >= p) {
--r;
}
}
swap(nums[left], nums[r]);
int k = r - left + 1;
if (k == n) {
return nums[r];
} else if (k > n) {
return quickSelect(nums, left, r - 1, n);
} else {
return quickSelect(nums, r + 1, right, n - k);
}
}
该函数接受一个vector类型的数组nums,以及查找的目标数字的下标n作为参数。函数返回排好序后的数组的第n大的数。
例如,我们可以这样调用该函数:
vector<int> nums = {3, 5, 2, 4, 1};
int n = 3;
int ans = quickSelect(nums, 0, nums.size() - 1, n);
cout << ans << endl; // 输出3
本题要求找出第n大的数,可以采用快速排序的思想进行查找。快速排序的时间复杂度为O(n),比排序的时间复杂度O(nlogn)更优秀。在实际使用中,可以通过实验确定n的大小,选择合适的算法进行查找。