215. 数组中的第K个最大元素

    xiaoxiao2024-10-27  82

    题目描述:

    在未排序的数组中找到第 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 ≤ 数组的长度。

    算法1:

     使用堆排序,构建一个大小为K的小顶堆,这种做法也可以作为输入数据流中实时的返回第K大的数

    class Solution { public: int findKthLargest(vector<int>& nums, int k) { priority_queue<int, vector<int>, greater<int>>q; for(int i=0; i<nums.size(); i++) { if(i<k) q.push(nums[i]); else { if(nums[i] > q.top()) { q.pop(); q.push(nums[i]); } else continue; } } return q.top(); } };

    算法2:

    使用快速排序的partition方法

    class Solution { public: int findKthLargest(vector<int>& nums, int k) { int left = 0, right=nums.size()-1; int index = partition(nums, 0, nums.size()-1); while(index != nums.size()-k) { if(index < nums.size()-k) { left = index+1; index = partition(nums, left, right); } else if(index > nums.size()-k) { right = index - 1; index = partition(nums, left, right); } else return nums[index]; } return nums[index]; } int partition(vector<int>& nums, int left, int right) { int i = left, j = right; while(i < j) { while(i<j && nums[j] >= nums[left]) j--; while(i<j && nums[i] < nums[left]) i++; swap(nums[i], nums[j]); } swap(nums[left], nums[i]); return i; } };

     

    最新回复(0)