九度 1371 最小的K个数
题目描述:输入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个数,并按从小到大顺序打印。
- 样例输入:
-
8 4
4 5 1 6 2 7 3 8
- 样例输出:
-
1 2 3 4
此题的不同之处是最后的输出结果需要是排序过的,一般是不要求这个的。
最常见的解法就是使用快速排序和大顶堆。
方法一使用快速排序的思想,划分的操作不用改,对递归部分稍作修改
#include<stdio.h>
#include<algorithm>
using namespace std;
int partition(int arr[], int s, int e){//返回分裂位置
int x = arr[s];//中轴元素
int j = e+;
int i = s;
while(i < j){
while(i < e && arr[++i] <= x);
while(j > s && arr[--j] > x);
if(i >= j) break;
swap(arr[j], arr[i]);
}
arr[s] = arr[j];
arr[j] = x;
return j;
}
int k;
void minK(int arr[],int start,int end){
if(start >= end) return;
int index = partition(arr,start,end);
if(index == k) return;
//类似二分的思想,比快速排序要少一个递归
if(index > k) minK(arr,start,index-);
else minK(arr,index+,end);
}
const int M = ;
int n,arr[M];
int main()
{
while(scanf("%d%d",&n, &k) != EOF){
for(int i=; i<n; i++){
scanf("%d", &arr[i]);
}
--k;
minK(arr,,n-);
sort(arr,arr+k+);//输出结果需要是排序的
for(int i=; i<k; i++)
printf("%d ",arr[i]);
printf("%d\n",arr[k]);
}
return ;
}
方法二使用 大顶堆。
#include <algorithm>
#include <cstdio>
using namespace std;
int n,k,a[];
void adjustHeap(int idx){
int l = idx* + ;
int r = idx* + ;
int largeIndex = idx;
//先检查边界。k即为要创建的堆的大小
while( l<k || r<k ){
if(l<k && a[l] > a[largeIndex]) largeIndex = l;
if(r<k && a[r] > a[largeIndex]) largeIndex = r;
if(largeIndex != idx){
//交换 root和子节点。
swap(a[idx], a[largeIndex]);
//交换之后继续调整子节点
idx = largeIndex;
l = idx* + ;
r = idx* + ;
}else{
break; //无需调整
}
}
}
void buildHeap(){
for(int i= (k-)/; i>=; i--){
adjustHeap(i);
}
}
int main(){
while(scanf("%d%d", &n, &k) != EOF){
for(int i = ; i < k; i++)
scanf("%d", &a[i]);
buildHeap();
for(int i = k; i < n; i++){
scanf("%d", &a[i]);
if(a[] > a[i]){
swap(a[],a[i]);
adjustHeap();
}
}
sort(a,a+k);
for(int i = ; i<k-; i++)
printf("%d ", a[i]);
printf("%d\n", a[k-]);
}
}
效率差不多
九度 1371 最小的K个数的更多相关文章
- 剑指Offer - 九度1371 - 最小的K个数
剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...
- 剑指Offer(二十九):最小的K个数
剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...
- 九度OJ 题目1371:最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...
- 剑指OFFER之最小的K个数(九度OJ1371)
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...
- 剑指offer二十九之最小的K个数
一.题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.思路 详解代码. 三.代码 import java.util. ...
- 输入一个数组,求最小的K个数
被这道题困了好久,看了剑指Offer才知道OJ上的要求有点迷惑性. 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 一 ...
随机推荐
- LightOJ 1341 Aladdin and the Flying Carpet 数学
题意:给个矩形的面积a,和矩形的最小边长b,问有多少种矩形的方案(不能是正方形) 分析:a可以写成x,y,因为不能是正方形,所以设x<y,那么x<sqrt(a),y>sqrt(a) ...
- SQL经典题-实战
Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname,T#) 课程表 ...
- FFT矩阵
举个例子: \[{F_4}=\left[{\begin{array}{*{20}{c}}1&1&1&1\\1&i&{-1}&{-i}\\1&{- ...
- TextField笔记
今天写scrollPanel组件,碰到一个问题:textfield自动什么时候会调节高度. 在创建TextField的时候,我制定了文本的height属性. 之后,无论怎么设置文本,height总是不 ...
- 编译 skia
0.准备工作 在 https://android.googlesource.com/ 用 git 代码,当然也可以从skia的官方https://code.google.com/p/skia/ 中获取 ...
- [HZWER]藏妹子之处
问题描述 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一 ...
- 【JS】Intermediate1:The DOM
1.DOM(The Document Object Model) A way to manipulate the structure and style of an HTML page. It rep ...
- UVALive 5135 Mining Your Own Business 双连通分量 2011final
题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱, ...
- The Basics
“Swift is a new programming language for iOS and OS X app development. Nonetheless, many parts of Sw ...
- 建立树莓派raspberry交叉编译环境以及编译内核
最近买了一个树莓派,玩了几天,虽然已经有很多人玩了,现在玩好像有点晚了,但是他确实是个好东西,学好它,对嵌入式的整个开发流程也就会熟悉很多.虽然性能不是很强和现在的BB-BLACK比有点慢了,但是它便 ...