提示:注意一下本题题意与此处代码的避免差一错误的细节。
class Solution { public: int findKthLargest(vector<int>& nums, int k) { quickSelect(nums, 0, nums.size() - 1, k - 1); return nums[k - 1]; } void quickSelect(vector<int>& arr, const int first, const int last, int k) { if (first >= last) { return; } // (优化)随机取一个数 int randIdx = first + (rand() % (last - first + 1)); swap(arr[randIdx], arr[first]); int left = first; int right = last; int border = arr[left]; while (left < right) { while (left < right && border >= arr[right]) { right += -1; } arr[left] = arr[right]; while (left < right && border <= arr[left]) { left += 1; } arr[right] = arr[left]; } arr[left] = border; // 判断是否满足k个 const int borderIdx = left; // 满足,停止递归 if (borderIdx == k) { return; } // 足够,递归左侧 else if (borderIdx > k) { quickSelect(arr, first, borderIdx - 1, k); } // 不够,递归右侧 else { quickSelect(arr, borderIdx + 1, last, k); } } };到此我们学习了基于分治思路的快速排序算法,且用随机选点进行了优化,并分析其原理衍生得到了快速选择的方法。
就拿其他同为排序的算法来说,如通过对插入排序的改良有了更强大的希尔排序,又如基于堆排序的思路可以实现出自己的优先队列的数据结构。
所以说只要我们仔细研究各种经典算法本质原理就能衍生更强大的功能!