这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法

方法一:

先将数据排列好,然后,然后return a[k]或者将前K个数加起来

方法二:

基于高速排序。如,一次高速排序将某一个数放到了第k个位置,那么前k-1个数都要比第k个数小。

后面的数都要比第k个位置上的数要大。所以当前第k个位置上的数就是第K小的数

1、NYOJ 678 最小K个数之和

这道题的时间放得比較松,不要求线性时间,所以用方法一也是能够的

/*
* ksmall1.cpp
*
* Created on: 2014年5月24日
* Author: pc
*/ #include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; int main(){
int n,k;
while(scanf("%d%d",&n,&k)!=EOF){
int a[n]; int i;
for(i = 0 ; i < n ; ++i){
scanf("%d",&a[i]);
} sort(a,a+n); int result = 0;
for(i = 0 ; i < k ; ++i){
result += a[i];
} printf("%d\n",result);
}
}

方法二:

#include<stdio.h>
#include<stdlib.h> int random(int low, int high) {
int size = high - low + 1;
return low + rand() % size;
} void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
} int partition(int *a, int left, int right) {
int key = a[left];
int i = left;
int j;
for(j = i + 1; j <= right; j++) {
if(a[j] <= key) {
if(i != j) {
i++;
swap(&a[i], &a[j]);
}
}
}
swap(&a[i], &a[left]);
return i;
} int random_partition(int *a, int left, int right) {
int index = random(left, right);
swap(&a[index], &a[left]);
return partition(a, left, right);
} int randomized_select(int *a, int left, int right, int k) {
if(left < 0 || (right - left + 1) < k)
return -1;
int pos = random_partition(a, left, right);
int m = pos - left + 1;
if(k == m) {
return pos;
} else if(k < m) {
return randomized_select(a, left, pos - 1, k);
} else {
return randomized_select(a, pos + 1, right, k - m);
}
} int main() {
int a[] = {1, 11, 23, 5, 6, 7, 20, 13, 22, 9, 34, 18};
int len = sizeof(a) / sizeof(int);
int k = 7;
randomized_select(a, 0, len - 1, k);
for(int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
}

(寻找第K小的数&amp;&amp;寻找第K小的数的和)的更多相关文章

  1. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...

  2. 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)

    取板粗   好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...

  3. 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小

    例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123. 解决方案 贪心算法,在每次被访问的位置保证有最优解. 思路一 分析:求一共n位,求其中的m位组成的数最小 ...

  4. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  5. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

  6. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  7. 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

    题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. ...

  8. 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。

    给定整数a1.a2.a3.....an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8). 分析:此题相对于本节"寻找满 ...

  9. 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...

随机推荐

  1. Laravel5.1学习笔记22 Eloquent 调整修改

    Eloquent: Mutators Introduction Accessors & Mutators Date Mutators Attribute Casting Introductio ...

  2. UVM基础之------uvm_port_base

    Port Base Classes    uvm_port_component_base    This class defines an interface for obtaining a port ...

  3. ci框架中model简单的mysql操作

    <?php class SingerModel extends CI_Model { function SingerModel() { //会将数据库对象赋值给CI_Controller的db属 ...

  4. Windows提高_2.3第三部分:内核区同步

    第三部分:内核区同步 等待函数(WaitForObject) 等待函数的形式 单个:WaitForSingleObject 多个:WaitForMultipleObjects 一个可以被等待的对象通常 ...

  5. logging,numpy,pandas,matplotlib模块

    logging模块 日志总共分为以下五个级别,这五个级别自下而上进行匹配debug->info->warning->error->critical,默认的最低级别warning ...

  6. PHP 浏览器端输出中文正常,cmd中文乱码

    cmd 运行php脚本乱码问题如果别的编码根据下面的自己换吧!chcp 65001 就是换成UTF-8chcp 936 可以换回默认的GBKchcp 437 是美国英语

  7. P1223 排队接水

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...

  8. springboot的jsp热部署

    使用springboot每次修改jsp都需要重新启动是不是很麻烦呢?以下是解决办法! yml格式 server: servlet: jsp: init-parameters: development: ...

  9. TestNG忽略测试

    用@Test(enabled = false) 声明需要被忽略执行的测试方法 package com.janson; import org.testng.annotations.Test; publi ...

  10. python3.x Day2 购物车程序练习

    购物车程序: 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4. ...