zoukankan      html  css  js  c++  java
  • AcWing 786.第k个数

    AcWing 786.第k个数

    题目描述

    给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。

    输入格式

    第一行包含两个整数 n 和 k。

    第二行包含 n 个整数(所有整数均在1~10^9
    范围内),表示整数数列。

    输出格式

    输出一个整数,表示数列的第k小数。

    数据范围

    1≤n≤100000,
    1≤k≤n

    输入样例

    5 3
    2 4 1 5 3
    

    输出样例

    3
    

    题目思路

    使用快速选择算法,在快排的基础上进行优化,达到O(N),
    每次只需要遍历1/2个长度

    #include<iostream>
    using namespace std;
    const int N = 1e5+10;
    
    int n,k;
    int q[N];
    
    int quick_sort(int l,int r,int k)
    {
        if(l>=r) return q[l];
        int x=q[l+r>>1],i=l-1,j=r+1;
        while(i<j)
        {
            while(q[++i]<x);
            while(q[--j]>x);
            if(i<j)
            {
                swap(q[i],q[j]);
            }
        }
        int sl = j-l+1;
        if(k>sl)
            return quick_sort(j+1,r,k-sl);
        return quick_sort(l,j,k);
    }
    
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)scanf("%d",&q[i]);
        int num = quick_sort(0,n-1,k);
        printf("%d",num);
        return 0;
    }
    
  • 相关阅读:
    emacs配置emacs-clang-complete-async
    emacs之配置自动安装脚本
    vim之YCM配置
    vim之vundle
    emacs之配置php
    kettle的日志
    kettle的报错解决机制
    kettle优化
    将BAT文件注册为服务的方法
    使用powerdesinger逆向生成表结构
  • 原文地址:https://www.cnblogs.com/fsh001/p/12263077.html
Copyright © 2011-2022 走看看