【剑指offer系列】 最小的k个数___30
来源:互联网 发布:博弈大师模拟软件 编辑:程序博客网 时间:2024/05/24 23:12
题目描述:
输入n个整数,返回其中最小的k个数
分析:
1)可以用快速排序的partion算法,当partion返回的索引为k或k-1时,左边的k个数恰好是最小的k个数(会改变原数组)
2)当输入的数据量非常大时,可用堆排序来解决。(适合海量数据)
代码:
int partion(vector<int>& nums,int begin,int end){ int pivot=nums[begin]; int i=begin,j=end; while(i<j){ while(i<j&&nums[j]>=pivot) --j; while(i<j&&nums[i]<=pivot) ++i; swap(nums[i],nums[j]); } swap(nums[begin],nums[j]); return j; } int findKthSmallest(vector<int>& nums, int k) { int l=0,r=nums.size()-1; k=k-1; while(l<=r){ int mid=partion(nums,l,r); if(mid==k) return nums[mid]; if(mid<k) l=mid+1; else r=mid-1; } }
非递归:
int findKthSmallest(vector<int>& nums, int k) { int l=0,r=nums.size()-1; k=k-1; while(l<=r){ int i=l,j=r; int pivot=nums[l]; while(i<j){ while(i<j&&nums[j]>=pivot) --j; nums[i]=nums[j]; while(i<j&&nums[i]<=pivot) ++i; nums[j]=nums[i]; } nums[i]=pivot; if(i==k) return nums[i]; if(i<k) l=i+1; else r=i-1; } }
0 0
- 【剑指offer系列】 最小的k个数___30
- 剑指offer系列源码-最小的K个数
- 剑指offer系列之二十八:最小的k个数
- 剑指offer系列之28:最小的k个数
- 剑指Offer系列-面试题30:最小的K个数
- 【剑指offer-解题系列(30)】最小的K个数
- 剑指offer:最小的k个数
- 【剑指offer】最小的k个数
- 剑指offer-30:最小的k个数
- 最小的k个数(剑指offer)
- 剑指offer--最小的K个数
- 剑指Offer之 - 最小的k个数
- 剑指offer-30 最小的K个数
- 剑指offer之最小的k个数
- 剑指offer 30 - 最小的k个数
- 《剑指offer》最小的K个数
- 【剑指Offer】最小的K个数
- 剑指offer—最小的K个数
- EasyAR脱卡方法
- WEB项目中使用UEditor(富文本编辑器)
- string操作函数
- BJTU 1687 lisp的解释器
- 自考那些事儿(七):信息资源管理(总述篇)
- 【剑指offer系列】 最小的k个数___30
- Java多态
- sdau-2 1002
- Ubuntu 13.04 开机找回用户密码
- 随机取10个数第十种
- ViewPager + Fragment 预加载问题
- day6
- 使用JavaScript实现动态创建含合并单元格(行)的表单
- Mac空间越来越少了怎么办?