题目描述:

输入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个数,并按从小到大顺序打印。

样例输入:
       
样例输出:
   

解题思路:

  我们通过快排找到第k个数,然后比他的小的都在左边,比他大的都在右边

void getNumber(int n,int m){
int i;
int begin = ;
int end = n-;
int index = patition(begin,end);
while(index != m-){
if(index > m-){
end = index -;
index = patition(begin,end);
}else{
begin = index+;
index = patition(begin,end);
}
}
}

  在进行一次快排,将数组有序的输出。

void Qsort(int begin,int end){
if(begin >= end)
return ;
else{
int middle = patition(begin,end);
Qsort(begin,middle-);
Qsort(middle+,end);
}
}

  快排的代码如下:

int patition(int begin,int end){
int index,small;
small = begin-;
for(index = begin;index < end;index++){
if(gArr[index] < gArr[end]){
small++;
if(small != index)
swap(index,small);
}
}
small++;
swap(small,end);
return small;
}
void swap(int i,int j){
int tmp = gArr[j];
gArr[j] = gArr[i];
gArr[i] = tmp;
}

全部代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 200000
int gArr[MAXSIZE]={};
void getNumber(int n,int m);
void Qsort(int begin,int end);
int patition(int begin,int end);
void swap(int i,int j);
int main(){
int n,m,i;
while(scanf("%d %d",&n,&m)!=EOF && n>= && n<=){
for(i=;i<n;i++)
scanf("%d",&gArr[i]);
getNumber(n,m);
Qsort(,m-);
for(i=;i<m-;i++){
printf("%d ",gArr[i]);
}
printf("%d\n",gArr[m-]);
}
return ;
}
void Qsort(int begin,int end){
if(begin >= end)
return ;
else{
int middle = patition(begin,end);
Qsort(begin,middle-);
Qsort(middle+,end);
}
}
void getNumber(int n,int m){
int i;
int begin = ;
int end = n-;
int index = patition(begin,end);
while(index != m-){
if(index > m-){
end = index -;
index = patition(begin,end);
}else{
begin = index+;
index = patition(begin,end);
}
}
}
int patition(int begin,int end){
int index,small;
small = begin-;
for(index = begin;index < end;index++){
if(gArr[index] < gArr[end]){
small++;
if(small != index)
swap(index,small);
}
}
small++;
swap(small,end);
return small;
}
void swap(int i,int j){
int tmp = gArr[j];
gArr[j] = gArr[i];
gArr[i] = tmp;
}
/**************************************************************
Problem: 1371
User: xhalo
Language: C
Result: Accepted
Time:950 ms
Memory:1696 kb
****************************************************************/

剑指OFFER之最小的K个数(九度OJ1371)的更多相关文章

  1. 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序

    剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...

  2. 剑指 Offer 40. 最小的k个数

    剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...

  3. 【剑指Offer】最小的K个数 解题报告(Python)

    [剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  4. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  5. Go语言实现:【剑指offer】最小的K个数

    该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...

  6. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

  7. 《剑指offer》最小的k个数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  8. 剑指Offer 29. 最小的K个数 (其他)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...

  9. 【剑指offer】最小的K个数

    一.题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.思路: 一群大牛在讨论用噼里啪啦各种排序,复杂度一般也都是O ...

随机推荐

  1. Python之异常篇 [待更新]

    简介 当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序 ...

  2. phpStorm 安装配置

    首先配置php解释器,进行相关设置: 配置nodejs支持 安装plugins nodejs. 问:如何修改模板的默认注释? 答:创建一个php文件,默认有: <?php/** * Create ...

  3. 新LNMP环境,但是SESSION跨页面或者刷新 session丢失

    唠叨:本地WAMP做了一个微信项目,一切OK,昨天需要在LINUX架设一套LNMP环境.但是,在架设代码的时候,登录总是不成功~~~ 最终解决:权限 其实,作为一个程序猿,只要涉及到服务器内容,都应该 ...

  4. sencha touch2 动画问题

    最近在review一个项目的代码, 发现返回操作比较乱,很多"从哪里来,到哪里去的操作"被写的一塌糊涂; 按照ios系统的进场出场动画(人家的体验还是很好的,必须借鉴)为标准,使用 ...

  5. Python开发环境

    --> Python开发环境简备 Python的优点除了其自身的各种特点外,还因为有众多第三方模块,为其扩展了各方面无数的功能. 虽然大多数时候在百度上随便搜都能搜到一大把,pypi (http ...

  6. 剑指Offer:找出数组中出现次数超过一半的元素

    题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...

  7. java中volatitle关键字的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致 的情况.volatile就是用 ...

  8. 【Java基础之容器】Iterator

    Iterator: ->所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象 ->Iterator对象称作迭代器,用以方便的实 ...

  9. Progress 自定义(一)-shape

    需求:自定义ProgressBar,使用系统自定义shape; 效果图: 1.默认底色: 2.第一进度颜色: 3.第二进度颜色: 实现分析: 1.目录结构: 代码实现: 1.progress_styl ...

  10. 使用BusyBox制作Linux根文件系统

    STEP 1:构建目录结构 创建根文件系统目录,主要包括以下目录/dev  /etc /lib  /usr  /var /proc /tmp /home /root /mnt /bin  /sbin  ...