Kth Largest Element in an Array
2015-08-26 19:36
369 查看
Kth Largest Element in an Array
题目:找到数组中第K大的数Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ array's length.
解法一
思路:先按照从大到小排序,然后求的第K个数,采用快速排序void quicksort(vector<int> &nums,int l,int h) { int i; int low=l; int high=h; int x=nums[l]; if(l>=h) return; while(low<high) { while(low<high&&nums[high]<=x) high--; if(low<high) nums[low]=nums[high]; while(low<high&&nums[low]>=x) low++; if(low<high) nums[high]=nums[low]; } nums[low]=x; quicksort(nums,l,low-1); quicksort(nums,low+1,h); } int findKthLargest(vector<int>& nums, int k) { int len=nums.size()-1; quicksort(nums,0,len); return nums[k-1]; }
解法二
思路,其实在上面用到快速排序的时候,我们求了其中一个key,这个key是用来划分的,大于key的放左边,小于key的值放右边,如果这个key真是位于我们求的K位置上面,那么就可以直接返回了,因为一趟过后key的位置是不会变了的,也就是已经提前找到了所求的值代码如下:class Solution { public: int findKthLargest(vector<int>& nums, int k) { int len=nums.size()-1; return findKth(nums,0,len,k); } int findKth(vector<int>&nums,int l,int h,int k) { if(l>=h) return nums[l]; int low=l; int high=h; int key=nums[l]; while(low<high) { while(low<high&&nums[high]<=key) high--; if(low<high) nums[low]=nums[high]; while(low<high&&nums[low]>=key) low++; if(low<high) nums[high]=nums[low]; } nums[low]=key; if(k==low+1) //表示已经 找 到了,直接返回K处的值即可 return nums[low]; else if(k<low+1) //K小于当前枢轴,那么在前面部分找 return findKth(nums,l,low-1,k); else //K大于当前枢轴,那么在后面部分找 return findKth(nums,low+1,h,k); } };
相关文章推荐
- css3的选择器
- See You Again
- 线性筛
- [leetcode-205]Isomorphic Strings(java)
- MongoDB学习八--MongoDB的索引操作
- Android常用控件之AutoCompleteTextView、Spinner
- angularjs自动加载和手动加载
- A Simple Problem with Integers(树状数组HDU4267)
- UVa 1153:Keep the Customer Satisifed(贪心)
- bzoj2595[Wc2008]游览计划
- KendoUI之kendoGrid服务端分页
- A Simple Problem with Integers(树状数组HDU4267)
- Configure,Makefile.am, Makefile.in, Makefile文件之间关系(转)
- 8/26/GridView/AutoCompleteTextView/Gallery/Spinner/ExpandableListView
- 先冷静一下 线段树单点更新HDU1166 敌兵布阵
- Codeforces 570 A. Elections
- 结合Scikit-learn介绍几种常用的特征选择方法
- OutMan——C语言中文件的操作
- iNOC产品部--完全数计算
- Android 中的接口回调