【LeetCode】215. 陣列中的第K個最大元素 結題報告 (C++)
阿新 • • 發佈:2018-11-21
原題地址:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/submissions/
題目描述:
在未排序的陣列中找到第 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 ≤ 陣列的長度。
解題方案:
陣列問題,在考研複習的時候遇見這道題,運用的是快排:
class Solution { public: int findKthLargest(vector<int>& nums, int k) { int high = nums.size(); int low = 0; while (low < high) { int i = low; int j = high - 1; int pivot = nums[low]; while (i <= j) { while (i <= j && nums[i] >= pivot) i ++; while (i <= j && nums[j] < pivot) j --; if (i < j) swap(nums[i ++], nums[j --]); } swap(nums[low], nums[j]); if (j == k - 1) return nums[j]; else if (j < k - 1) low = j + 1; else high = j; } } };
本題給出的提示是堆和分治演算法,採用堆的方式,利用庫中的堆:
class Solution { public: int findKthLargest(vector<int>& nums, int k) { // 利用優先順序佇列 // 建立一個小根堆 // 先填滿k個數, // 接下來的數如果比堆頂小,則直接丟棄若大於堆頂,則替換堆頂 priority_queue<int, vector<int>, greater<int>> q; for (int i = 0; i < nums.size(); ++i) { if (i < k) { q.push(nums[i]); } // i >= k else if (nums[i] > q.top()) { q.pop(); q.push(nums[i]); } } return q.top(); } };