• 剑指OFFER之最小的K个数(九度OJ1371)


    题目描述:

    输入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

    解题思路:

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

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

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

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

      快排的代码如下:

    int patition(int begin,int end){
        int index,small;
        small = begin-1;
        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]={0};
    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>=1 && n<=200000){
            for(i=0;i<n;i++)
                scanf("%d",&gArr[i]);
            getNumber(n,m);
            Qsort(0,m-1);
            for(i=0;i<m-1;i++){
                printf("%d ",gArr[i]);
            }
            printf("%d
    ",gArr[m-1]);
        }
        return 0;
    }
    void Qsort(int begin,int end){
        if(begin >= end)
            return ;
        else{
            int middle = patition(begin,end);
            Qsort(begin,middle-1);
            Qsort(middle+1,end);
        }
    }
    void getNumber(int n,int m){
        int i;
        int begin = 0;
        int end = n-1;
        int index = patition(begin,end);
        while(index != m-1){
            if(index > m-1){
                end = index -1;
                index = patition(begin,end);
            }else{
                begin = index+1;
                index = patition(begin,end);
            }
        }
    }
    int patition(int begin,int end){
        int index,small;
        small = begin-1;
        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
    ****************************************************************/
  • 相关阅读:
    微信出现BUG,发送“ 两位数字+15个句号 ”,双方系统会卡崩……
    手机 https 抓包---Charles篇
    AI通过了艺术创作图灵测试,你根本分不出来作者是不是人
    SublimeText SFTP连接Amazon EC2
    Facebook在代码里下毒,百度身受重伤。。。
    马斯克:有62%的程序员认为人工智能会被武器化 #精选AR人工智能算法
    映客创始人套现12.5亿之后,哪个行业最有可能成为未来造富神话?
    《A.I.爱》王力宏与人工智能谈恋爱 邀李开复来客串
    现代软件工程作业 – 计算最长英语单词链
    软件工程课的分数系统,和打分方法
  • 原文地址:https://www.cnblogs.com/xing901022/p/3789730.html
Copyright © 2020-2023  润新知