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

    AcWing 786.第k个数

    题目描述

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

    输入格式

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

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

    输出格式

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

    数据范围

    1n1000001≤n≤100000,
    1kn

    输入样例:

    5 3
    2 4 1 5 3
    

    输出样例:

    3

    思路

    题目中要求使用快速选择排序,思路同快速排序,但是在进行递归处理的时候进行选择性的区间

    • 如果分好左右区间后,左区间长度 k <= 左区间长度sl , 递归左区间
    • 反之递归右区间,此时因为k是针对整个区间长度的,所以在右区间中为 k - sl
    • 一直保证我们需要的值一直在我们选择的区间之内,故  left == right 时, 返回其下标值
     1 #include <iostream>
     2 #include <algorithm>
     3 
     4 using namespace std;
     5 
     6 const int N = 1e6 + 10;
     7 int a[N], n;
     8 
     9 int quickSort(int l, int r, int k){
    10     if(l == r) return l;
    11     
    12     int i = l - 1, j = r + 1, x = a[l + r >> 1];
    13     
    14     while(i < j){
    15         do ++i; while(a[i] < x);
    16         do --j; while(a[j] > x);
    17         if(i < j) swap(a[i], a[j]);
    18     }
    19     
    20     int sl = j - l + 1;//左边区间的数量
    21     if(k <= sl) return quickSort(l, j, k);
    22     else return quickSort(j + 1, r, k - sl);//如果是递归右边的话,第k小的数是针对整个区间的,在右边就是第k - 左边区间的个数
    23     
    24 }
    25 int main(){
    26     ios::sync_with_stdio(false);
    27     int k;
    28     
    29     cin >> n >> k;
    30     
    31     for(int i = 0; i < n; ++i)
    32         cin >> a[i];
    33         
    34     cout << a[quickSort(0, n - 1, k)] << endl;
    35     
    36     return 0;
    37 }
  • 相关阅读:
    ueditor单独调用图片上传
    百度Ueditor多图片上传控件
    linux基础之vim编辑器
    linux基础之进阶命令二
    linux基础之基础命令一
    Python基础之PyCharm快捷键大全
    IT菜鸟之VTP应用项目
    IT菜鸟之总结(Du teacher)
    IT菜鸟之DHCP
    IT菜鸟之路由器基础配置(静态、动态、默认路由)
  • 原文地址:https://www.cnblogs.com/Lngstart/p/12257867.html
Copyright © 2011-2022 走看看