在大年初二,全国人民都还待在家里,为避免疫情的进一步扩散尽自己一份力量的时候,80,90后的精神偶像,刚在年三十录制了视频祝中国人民新春快乐的科比,在北京时间凌晨4点左右因直升机意外坠毁去世了。这是一个很没有实感的消息,但它却是真实的,很残酷。你永远不知道明天和意外哪个会先到来,科比甚至还没能活着见证自己进入NBA名人堂,珍惜当下!
科比走了,曼巴精神永存!
我还以为不幸已经过去,没想到是个开始
该死的冠状病毒,让我连年都没法回家过!
leetcode[215] Kth Largest Element in an Array 解法及代码
题目描述:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:
最偷懒的解法,直接用stl的部分排序(全排序必然超时), 输出第K个元素
#include <algorithm> int findKthLargest(vector<int>& nums, int k) { std::partial_sort(nums.begin(), nums.begin() + k, nums.end(), [](auto& a, auto& b) { return a > b; }); return nums[k - 1]; }
这里需要注意的是partial_sort的第三个参数,需要自定义排序规则,默认从小到大,我们需要从大到小。
解法2:
建立一个大顶堆,使用堆排序,排到第K个数时停止并返回,代码:
void percolateDown(vector<int>& nums, int start, int end) { for (int j = 2 * start + 1; j <= end; j = 2 * start + 1) { if (j < end && nums[j + 1] >= nums[j]) j++; if (nums[start] > nums[j]) break; int temp = nums[start]; nums[start] = nums[j]; nums[j] = temp; start = j; } } void makeHeap(vector<int>& nums) { int len = nums.size(); for (int r = len / 2 - 1; r >= 0; r--) { percolateDown(nums, r, len - 1); } } int heapSort(vector<int>& nums, int k) { int n = nums.size() - 1; for (int i = 0; i < k; i++) { int temp = nums[n]; nums[n] = nums[0]; nums[0] = temp; n--; percolateDown(nums, 0, n); } return nums[nums.size() - k]; } int findKthLargest(vector<int>& nums, int k) { makeHeap(nums); return heapSort(nums, k); }
2020,新的开始!
终于开始写博客了,再多的痛苦与无奈都已过去,2020,加油吧!