九度 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. 一 ...
随机推荐
- 结构体dict_index_t;
/** InnoDB B-tree index */ typedef struct dict_index_struct dict_index_t; /** Data structure for an ...
- JQuery对XML文件的操作
xml文件如下: <?xml version="1.0" encoding="utf-8" ?> <Root> <Parent&g ...
- POJ1456 Supermarket 贪心
贪心策略:一定先卖价值最大的,然后考虑卖当前的物品,卖的日期越靠后,越优,可以为以后的物品提供机会 #include <stdio.h> #include <string.h> ...
- ms sql server缓存清除与内存释放
Sql Server系统内 存管理在没有配置内存最大值,很多时候我们会发现运行Sql Server的系统内存往往居高不下.这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系 ...
- Javascript的简介和使用
摘要:先讨论JavaScript的由来和一些比较容易混淆的概念,又讨论了JavaScript的实现,紧接着说明了在网页中怎么有效地更好地引入js代码. JavaScript的由来 是从一个简单的输入验 ...
- Step-by-Step Guide to Portal Development for Microsoft Dynamics CRM - 摘自网络
The Challenge Oftentimes in the world of Dynamics CRM, the need arises for non-CRM users to gain acc ...
- JavaScript- The Good Parts Chapter 4
Why, every fault’s condemn’d ere it be done:Mine were the very cipher of a function. . .—William Sha ...
- 框架技术--S2SH框架整合(spring部分)No 3--声明式事务
声明式事务:就是讲事务的处理,通过配置进行配置. 几种传播特性 1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启(比较常用) 2. PROPA ...
- Activity 的启动模式
好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...
- CopyU!v2.2 增加对设备信息的识别
更新版本的CopyU!v2.2已经完成大部分功能的设计,主打升级功能“设备信息识别”已经基本完成,现在放上测试截图: