首页 > 其他分享 >第k个数

第k个数

时间:2024-03-01 22:22:42浏览次数:19  
标签:数列 int 个数 while 排序 部分

1.问题描述

一个题目是这样的,先给一行整数数列,求数列从小到大排列之后的第 k 个数。
暴力解法就是先排好序,然后输出第 k 个数。
但是如果给定的数列太大,排序的过程就会浪费很多的时间,我们可以通过快速排序的性质,使其在未完全排好序的过程中就可以找到第 k 个数。
点击查看快速排序讲解

2.解题思路

首先在快速排序的过程中,我们是将数列每次都分成两个部分进行排序,如果我们设法得知了第 k 个数所在的部分,那么另外一个部分,我们就可以不需要进行排序了。

现在我们的问题就是如何得知第 k 个数所在的部分是哪一个。在快速排序分好两个部分之后,我们可以得知,第一个部分为 [l, j],第二个部分为 [j + 1, r]。我们还可以知道第一个部分是小于第二个部分的,那么 第一个部分里的整数就是 第1个数,第2个数,......,第j - l + 1个数,如果 k <= j - l + 1 那么就说明 k 在第一个部分里,否则就是在第二个部分里。此时我们所求的数在第二个部分里就是 第 k - (j - l + 1)个数

3.代码实现

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 100, INF = 1e9;
int arr[N], n, k;

int quick_sort(int* a, int l, int r, int kt){
    if (l >= r) return a[l];
    int i = l - 1, j = r + 1, mid = a[l + r >> 1];
    while (i < j){
        do i ++; while (a[i] < mid);
        do j --; while (a[j] > mid);
        if (i < j) swap(a[i], a[j]);
    }
    int x = j - l + 1; //算出第一个部分中包含的整数个数
    if (kt <= x) return quick_sort(a, l, j, kt);
    else return quick_sort(a, j + 1, r, kt - x); // 注意此处kt需要减去x的值,因为前x的数在第一个部分中
}

void solve(){
    cin >> n >> k;
    for (int i = 1; i <= n; i++){
        cin >> arr[i];
    }
    cout << quick_sort(arr, 1, n, k) << "\n";
}

int main(){
    int tt = 1;
	// cin >> tt;
	while (tt--){
        solve();
    }
    return 0;
}

标签:数列,int,个数,while,排序,部分
From: https://www.cnblogs.com/ora-ing/p/18048088

相关文章

  • JAVA基础:数组在计算机中的执行原理 多个变量指向一个数组
    程序都是在计算机中的内存中执行的,java程序编译之后会产生一个class文件,这个class文件是提取到内存中的JVM虚拟机中执行的。java为了便于虚拟机这个java程序,也即这个class文件。将虚拟机这块内存区域进行了划分:方法区,栈,堆,  本地方法栈,程序计数器方法区:放编译后的class文件的......
  • 350. 两个数组的交集 II C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intmin(inti,intj){if(i<j)returni;returnj;}int*intersect(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]=......
  • 349. 两个数组的交集C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/int*intersection(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]={0};inthash2[1001]={0};int*tem=(int*)malloc(sizeof......
  • 记录指定个数的成语
    #!/usr/bin/envpython#-*-coding:utf-8-*-"""#File:chengyu-001.py#Time:2024/1/1611:55#Author:lrtao2010#version:python3.10.1#Description:记录指定个数的成语"""#导入模块importrequests#下载网页impor......
  • Mybatis-Plus接入多个数据源
    导入依赖<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>编辑properties#db1spring.d......
  • 代码随想录 第六天 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交
    LeetCode:242.有效的字母异位词-力扣(LeetCode)思路:既然只判断两个字符串的字母,就一个++,一个--,最后如果二十六个字母都是零,说明两个字符串相等。反思: //charat(i)是返回字符串索引,所以s.charAt(i)-'a'实际上是获取字符串s中第i个字符相对于字母'a'的偏移量。......
  • C++ GDAL用CreateCopy()新建栅格并修改波段的个数
      本文介绍基于C++语言GDAL库,为CreateCopy()函数创建的栅格图像添加更多波段的方法。  在C++语言的GDAL库中,我们可以基于CreateCopy()函数与Create()函数创建新的栅格图像文件。其中,CreateCopy()函数需要基于一个已有的栅格图像文件作为模板,将模板文件的各项属性信息(例如空间......
  • Accurately computing running variance —— 已知两个数列各自的均值和方差,如何快速
    原内容来自:https://www.johndcook.com/blog/standard_deviation/计算公式:该种计算方式可以只保存历史数据的平方和,与历史数据的和。相关前文:已知两个数列各自的均值和方差,如何快速求出两个数列拼合后的均值和方差......
  • 已知两个数列各自的均值和方差,如何快速求出两个数列拼合后的均值和方差
    问题:数列A为[1,2,3,4,5,6,7,8,9],已知数列A的均值和方差和个数为mean_x,var_x,size_x数列B为[20,21,22,23,24,25,26,27,28,29],已知数列B的均值和方差和个数为mean_y,var_y,size_y现在将数列A与数列B拼合为数列Z,则数列Z为[1,2,3,4,5,6,7,8,9,20,......
  • 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一
    2024-02-24:用go语言,给你一个n个点的带权无向连通图,节点编号为0到n-1,同时还有一个数组edges,其中edges[i]=[fromi,toi,weighti],表示在fromi和toi节点之间有一条带权无向边,最小生成树(MST)是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最......