zoukankan      html  css  js  c++  java
  • 剑指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
    ****************************************************************/
  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/xing901022/p/3789730.html
Copyright © 2011-2022 走看看