215. Kth Largest Element in an Array
来源:互联网 发布:传奇手游 源码 编辑:程序博客网 时间:2024/05/14 14:06
classical problem
解法依次为,选择排序,分治排序,堆排序,堆排序+,快排1,快排2,快排2+,快排2++
//360ms select sort//O(kn)class Solution {public: void get_min(vector<int>& v, int k) { int mark=k; for(int i=k+1;i<v.size();i++) { if(v[mark]<v[i]) mark=i; } if(mark!=k) { int temp=v[mark]; v[mark]=v[k]; v[k]=temp; } } int findKthLargest(vector<int>& nums, int k) { for(int i=0;i<k;i++) { get_min(nums,i); } return nums[k-1]; }};
//merge sort 20ms //O(nlgn) class Solution {public: void merge(vector<int>& v, int l,int m,int r) { vector<int> temp(v.begin()+l,v.begin()+m+1); int k=m+1; int start=l; m=m-l; l=0; while(l<=m&&k<=r) { if(temp[l]<v[k]) v[start++]=v[k++]; else v[start++]=temp[l++]; } if(l<=m) while(l<=m) v[start++]=temp[l++]; } void my_sort(vector<int>& v, int l,int r) { if(l==r) return; if(l==r-1) { if(v[l]>=v[r]) return; int temp=v[l]; v[l]=v[r]; v[r]=temp; return; } int m=l+(r-l)/2; my_sort(v,l,m); my_sort(v,m+1,r); merge(v,l,m,r); } int findKthLargest(vector<int>& nums, int k) { my_sort(nums,0,nums.size()-1); return nums[k-1]; }};
//heap sort 24ms//O(nlogn)class Solution {public: void keep_max_heap(vector<int>& v,int i,int max_len) { int l=i*2+1; int r=l+1; int biggest=i; if(l<max_len&&v[l]>v[i]) biggest=l; if(r<max_len&&v[r]>v[biggest]) biggest=r; if(biggest!=i) { int temp=v[biggest]; v[biggest]=v[i]; v[i]=temp; keep_max_heap(v,biggest,max_len); } } void heap_sort(vector<int>& v) { int len=v.size(); for(int i=(len-1)/2;i>=0;i--) keep_max_heap(v,i,len); while(len-->1) { int temp=v[0]; v[0]=v[len]; v[len]=temp; keep_max_heap(v,0,len); } } int findKthLargest(vector<int>& nums, int k) { heap_sort(nums); return nums[nums.size()-k]; }};
//heap sort 16ms//O(klogn)class Solution {public: void keep_max_heap(vector<int>& v,int i,int max_len) { int l=i*2+1; int r=l+1; int biggest=i; if(l<max_len&&v[l]>v[i]) biggest=l; if(r<max_len&&v[r]>v[biggest]) biggest=r; if(biggest!=i) { int temp=v[biggest]; v[biggest]=v[i]; v[i]=temp; keep_max_heap(v,biggest,max_len); } } void heap_sort(vector<int>& v,int k) { int len=v.size(); for(int i=(len-1)/2;i>=0;i--) keep_max_heap(v,i,len); while(len-->v.size()-k) { int temp=v[0]; v[0]=v[len]; v[len]=temp; keep_max_heap(v,0,len); } } int findKthLargest(vector<int>& nums, int k) { heap_sort(nums,k); return nums[nums.size()-k]; }};
//quick_sort 240msclass Solution {public: void quick_sort(vector<int>& v,int l,int r) { if(l>=r) return; if(l==r-1) { if(v[l]<v[r]) return; int temp=v[l]; v[l]=v[r]; v[r]=temp; return; } int l0=l; int r0=r; int mark=v[l++]; while(l<r) { while(l<=r0&&v[l]<=mark) l++; while(r>l0&&v[r]>mark) r--; if(l<r) { int temp=v[l]; v[l]=v[r]; v[r]=temp; } } if(l==l0) { quick_sort(v,l0+1,r0); return; } int temp=v[l-1]; v[l-1]=v[l0]; v[l0]=temp; quick_sort(v,l0,l-2); quick_sort(v,l,r0); } int findKthLargest(vector<int>& nums, int k) { quick_sort(nums,0,nums.size()-1); //for(int i=0;i<nums.size();i++) cout<<nums[i]<<" "; //cout<<endl; return nums[nums.size()-k]; }};
//296ms quick_sortclass Solution {public: int find_partition(vector<int>& v,int l,int r) { int mark=v[l]; int start=l; int i=l; for(int j=l+1;j<=r;j++) { if(v[j]<=mark) { i++; if(i!=j) { int temp=v[i]; v[i]=v[j]; v[j]=temp; } } } int temp=v[i]; v[i]=v[start]; v[start]=temp; return i; } void quick_sort(vector<int>& v,int l,int r) { if(l>=r) return; int q=find_partition(v,l,r); quick_sort(v,l,q-1); quick_sort(v,q+1,r); } int findKthLargest(vector<int>& nums, int k) { quick_sort(nums,0,nums.size()-1); return nums[nums.size()-k]; }};
//72ms//from quick_sortclass Solution {public: int find_partition(vector<int>& v,int l,int r) { int mark=v[l]; int start=l; int i=l; for(int j=l+1;j<=r;j++) { if(v[j]>=mark) { i++; if(i!=j) { int temp=v[i]; v[i]=v[j]; v[j]=temp; } } } int temp=v[i]; v[i]=v[start]; v[start]=temp; return i; } void quick_sort(vector<int>& v,int l,int r,int &k) { if(l>=r) return; int q=find_partition(v,l,r); if(q==k-1) return; if(q>k-1) quick_sort(v,l,q-1,k); if(q<k-1) quick_sort(v,q+1,r,k); } int findKthLargest(vector<int>& nums, int k) { quick_sort(nums,0,nums.size()-1,k); return nums[k-1]; }};
//12ms//随机产生划分点//O(n)class Solution {public: int find_partition(vector<int>& v,int l,int r) { int rand_index=l+rand()%(r-l+1); if(rand_index!=l) { int temp=v[l]; v[l]=v[rand_index]; v[rand_index]=temp; } int mark=v[l]; int start=l; int i=l; for(int j=l+1;j<=r;j++) { if(v[j]>=mark) { i++; if(i!=j) { int temp=v[i]; v[i]=v[j]; v[j]=temp; } } } int temp=v[i]; v[i]=v[start]; v[start]=temp; return i; } void quick_sort(vector<int>& v,int l,int r,int &k) { if(l>=r) return; int q=find_partition(v,l,r); if(q==k-1) return; if(q>k-1) quick_sort(v,l,q-1,k); if(q<k-1) quick_sort(v,q+1,r,k); } int findKthLargest(vector<int>& nums, int k) { quick_sort(nums,0,nums.size()-1,k); return nums[k-1]; }};
0 0
- 215.Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- 215. Kth Largest Element in an Array
- Eclipse配置PyDev插件安装方法
- Bestcoder Pro.ID 2006 求奇数的乘积
- 深入理解C++中的mutable关键字
- C++ 常用类型转换的区别
- 记录为经典eclipse 添加java Web 开发插件地址
- 215. Kth Largest Element in an Array
- 类似支付宝 支付时候 的动画 Progress
- Git备忘录
- 忘记Django登陆账号和密码的处理方法
- 工业控制系统USB存储设备可信管理方案的(ICICS2015)论文PPT:TMSUI: A Trust Management Scheme
- CocoaPods版本升级
- iOS注册APNs通知
- C++单词统计(文件流、正则的应用)
- Windows 7 安装64位 Python 2.7.3 开发环境