数组中的第K个最大元素(TopK问题)
題目描述
在未排序的數組中找到第 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
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
思路一(全局排序)
很直接,對原數組排序,然后返回第 k 個最大的元素(nums[n-k])即可。
時間復雜度為 O(Nlog?N)O(N \log N)O(NlogN)
思路二(局部排序)
用冒泡排序,選出k個最大的數,返回nums[k-1]即可。
時間復雜度為 O(Nk)O(Nk)O(Nk)
代碼(c++)
class Solution { public:int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;for(int i=0;i<k;i++){for(int j=nums.size()-1;j>i;j--){if(nums[j]>nums[j-1]) swap(nums[j],nums[j-1]);}}return nums[k-1];} };思路三(堆)
維護一個存放k個元素的小頂推,遍歷數組,依次與堆頂元素比較,如果當前元素比堆頂元素大,則堆頂元素出堆,該元素入堆;否則繼續遍歷數組。這樣,當遍歷完所有元素后,堆中存放的便是數組中最大的k個數,堆頂便是第k大的數。
時間復雜度為 O(Nlog?k)O(N \log k)O(Nlogk)
代碼(c++)
class Solution { public:int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;priority_queue<int,vector<int>,greater<int> > q;for(int i=0;i<k;i++) q.push(nums[i]);for(int i=k;i<nums.size();i++){if(q.top()<nums[i]){q.pop();q.push(nums[i]);}}return q.top();} };思路四(減治法)
快速排序每一次都會確定一個數在排序后的位置。這里我們可以利用快速排序這一特點,當找到第n-k個數,停止排序,返回該元素即可。
這里之所以是減治,是因為我們不需要真的像快速排序那樣,分別處理由排好序的那個數分開的兩個子數組。我們只需判斷排好序的那個數的位置與n-k的大小關系,確定所要找的數所在的子數組,處理這個子數組便可。
時間復雜度 平均情況 O(N)O(N)O(N),最壞情況 O(N2)O(N^2)O(N2)。
代碼(c++)
class Solution { public:int quickSort(vector<int>& nums,int l,int r,int k){int index=(int)round(1.0*rand()/RAND_MAX*(r-l)+l);swap(nums[index],nums[l]);int temp=nums[l];int left=l;int right=r;while(left<right){while(left<right&&nums[right]>=temp) right-=1;nums[left]=nums[right];while(left<right&&nums[left]<temp) left+=1;nums[right]=nums[left];}nums[left]=temp;if(left==k) return nums[left];else if(left<k) return quickSort(nums,left+1,r,k);else return quickSort(nums,l,right-1,k);}int findKthLargest(vector<int>& nums, int k) {if(nums.size()==0) return 0;srand((unsigned)time(NULL));int tempK=nums.size()-k;return quickSort(nums,0,nums.size()-1,tempK);} };總結
以上是生活随笔為你收集整理的数组中的第K个最大元素(TopK问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式linux 控制台 驱动,控制台驱
- 下一篇: 自考计算机本科怎么学,自考经验:3至5年