日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组中的第K个最大元素(TopK问题)

發布時間:2023/12/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组中的第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问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。