求最小的k个数
来源:互联网 发布:oracle sql优化 编辑:程序博客网 时间:2024/05/01 10:31
public:
int partition(int left,int right,vector<int> &nums)
{
//int left=0,right=len-1;
while(left<right)
{
while(left<right&&nums[left]<=nums[right])
right--;
if(left<right) swap(nums[left],nums[right]);
while(left<right&&nums[right]>=nums[left])
left++;
if(left<right) swap(nums[left],nums[right]);
}
return left;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>result;
int len=input.size();
if(len==0) return result;
if(k>len) return result;
if(k==0) return result;
int mid=partition(0,len-1,input); //先求出中间
while(mid!=k-1) //个数不满足的话
{
if(mid>k-1)
{
mid=partition(0,mid-1,input);
}
else{
mid=partition(mid+1,len-1,input);
}
}
result.assign(input.begin(),input.begin()+k); // 不要和return连着写
return result;
}
};
下面是堆排序
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
vector<int>result;
if(len==0) return result;
if(k>len) return result;
input.insert(input.begin(),0);
heapsort(len,input);
result.assign(input.begin()+1,input.begin()+k+1);
return result;
}
void sift(int i,int m,vector<int>&a)
{
int j=2*i;
while(j<=m)
{
if(j<m&&a[j+1]>a[j]) j++;
if(a[j]<=a[i]) break;
else {
swap(a[j],a[i]);
i=j;
j=2*i;
}
}
}
void heapsort(int n,vector<int>&a)
{
for(int i=n/2;i>=1;i--)
sift(i,n,a);
for(int i=1;i<n;i++)
{
swap(a[1],a[n-i+1]);
sift(1,n-i,a);
}
}
};
这个是用堆排序的思想做的;
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
vector<int>result;
if(len==0) return result;
if(k>len) return result;
input.insert(input.begin(),0);
for(int i=k/2;i>=1;i--)
sift(i,k,input);
for(int i=k+1;i<=len;i++)
{
if(input[i]<input[1]) {
swap(input[i],input[1]);
sift(1,k,input);
}
}
result.assign(input.begin()+1,input.begin()+k+1);
return result;
}
void sift(int i,int m,vector<int>&a)
{
int j=2*i;
while(j<=m)
{
if(j<m&&a[j+1]>a[j]) j++;
if(a[j]<=a[i]) break;
else {
swap(a[j],a[i]);
i=j;
j=2*i;
}
}
}
void heapsort(int n,vector<int>&a)
{
for(int i=n/2;i>=1;i--)
sift(i,n,a);
for(int i=1;i<n;i++)
{
swap(a[1],a[n-i+1]);
sift(1,n-i,a);
}
}
};
- 求最小的K个数
- 求最小的k个数
- 求最小的k个数
- 求第k个数,最小的K个数
- 面试题:求最小的K个数。
- 求数组中最小的k个数
- bfprt算法求最小的k个数
- 求n个数中最小的K个数。
- 算法面试题:求最小的k个束/求数组中最小的k个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 常量指针与指针常量
- Leetcode -- Insertion Sort List
- hdu 1061Rightmost Digit 模幂运算
- Linux下的调试工具
- 104Maximum Depth of Binary Tree
- 求最小的k个数
- hdu 5131 Song Jiang's rank list(模拟)
- HDU 2871 Memory Control(线段树·区间合并·Vector)
- leetcode 128: Longest Consecutive Sequence
- uva 11795 状压dp
- typedef和#define究竟有什么区别?
- Android学习心得(13) --- Android代码混淆(1)
- 软件架构设计
- Valgrind简单用法