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

    题目描述

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


    输入格式
    第一行包含两个整数 n 和 k。

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


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


    数据范围
    1≤n≤100000, 1≤k≤n

    输入样例:
    5 3
    2 4 1 5 3

    输出样例:
    3

    思路

    ①C++STL无敌

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 using namespace std;
     6 const int max_n=1e5+5;
     7 int a[max_n];
     8 
     9 int main() {
    10     int n, k;
    11     cin>>n>>k;
    12     for(int i=0; i<n; i++) cin>>a[i];
    13     sort(a, a+n);
    14     cout<<a[k-1]<<endl;
    15     return 0;
    16 }

    ②手打快排

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 using namespace std;
     6 const int max_n=1e5+5;
     7 int a[max_n];
     8 
     9 void quickSort(int l, int r) {
    10     if(l>=r) return;
    11     int i=l-1, j=r+1, x=a[l+r >> 1];
    12     while(i<j) {
    13         do i++; while(a[i]<x);
    14         do j--; while(a[j]>x);
    15         if(i<j) swap(a[i], a[j]);
    16     }
    17     quickSort(l, j);
    18     quickSort(j+1, r);
    19 }
    20 
    21 int main() {
    22     int n, k;
    23     cin>>n>>k;
    24     for(int i=0; i<n; i++) cin>>a[i];
    25     quickSort(0, n-1);
    26     cout<<a[k-1]<<endl;
    27     return 0;
    28 }

    ③直接找下标k-1对应的那个值,每次只需判断k-1所在区间(左区间还是右区间)然后对其递归排序即可,省去了对另一个区间排序的操作

     这是某个大佬的思路,原链接请click here.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 using namespace std;
     6 const int max_n=1e5+5;
     7 int a[max_n];
     8 
     9 void quickSort(int l, int r, int k) {
    10     if(l>=r) return;
    11     int i=l-1, j=r+1, x=a[l+r >> 1];
    12     while(i<j) {
    13         do i++; while(a[i]<x);
    14         do j--; while(a[j]>x);
    15         if(i<j) swap(a[i], a[j]);
    16     }
    17     if(k<=j) quickSort(l, j, k);
    18     else quickSort(j+1, r, k);
    19 }
    20 
    21 int main() {
    22     int n, k;
    23     cin>>n>>k;
    24     for(int i=0; i<n; i++) cin>>a[i];
    25     quickSort(0, n-1, k-1);
    26     cout<<a[k-1]<<endl;
    27     return 0;
    28 }
  • 相关阅读:
    PS 灰度处理图片 然后翻转黑白颜色
    其它 门 修改密码
    uview组件部分样式丢失.u-flex样式丢失
    微信公号号-模板通知问题
    background-image详细属性
    VS code更换编辑器自定义背景图片
    console.log显示数据与展开运算符显示数据不一致
    项目展示
    ASP.Net Core解读依赖注入
    注意力增强卷积 代码解读
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13674399.html
Copyright © 2011-2022 走看看