输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
-
输入:
-
每个测试案例包括2行:
第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度。
第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。
-
输出:
-
对应每个测试案例,输出最小的k个数,并按从小到大顺序打印。
分析:用排序的话排序复杂O(nlogn),用类似快排的分治O(nlogk)
int a[200001];
inline void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}
void solve(int *a, int k, int l, int n)
{
if (n-l <= k || l == n)
return;
int pivot = a[l];
int i = l+1, j = n-1;
while(i <= j)
{
while(a[j] >= pivot && i<=j)
--j;
while(a[i] <= pivot && i<=j)
++i;
if (i < j)
swap(a[i], a[j]);
}
swap(a[l], a[j]);
if (j+1-l == k)
return;
else if (j+1-l > k)
solve(a, k, l, j);
else
solve(a, k-j-1+l, j+1, n);
}