(寻找第K小的数&&寻找第K小的数的和)
这一篇博客以一些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小的数&&寻找第K小的数的和)的更多相关文章
- 力扣:丑数II和数组中前K大的元素
数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...
- 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)
取板粗 好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123. 解决方案 贪心算法,在每次被访问的位置保证有最优解. 思路一 分析:求一共n位,求其中的m位组成的数最小 ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数
题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...
- 找出一堆数中最小的前K个数
描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...
- 给定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) 输出: 一个整数. ...
- 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。
给定整数a1.a2.a3.....an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8). 分析:此题相对于本节"寻找满 ...
- 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案
/** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...
随机推荐
- overflow实现隐藏滚动条同时又可以滚动
.scroll-list ul{ white-space: nowrap; -webkit-overflow-scrolling: touch; overflow-x: auto; overflow- ...
- 百度人脸识别AI实践.doc
0, 前言 百度开放了很多AI能力,其中人脸识别就是其中之一. 本文对百度人脸识别AI进行实践检验,看看其使用效果如何. 鉴于是最为基础的实践,基本都是在其接口范例代码修改而来. 百度人脸识别AI网站 ...
- HDU_1203_01背包
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Windows下编译64位GSL
GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)官方并没有提供编译好的Windows版本.首先要保证Windows是64位的 ...
- VR虚拟红包的技术实现
2017年1月20日,腾讯发布消息称将推出Q-Glass,除了一般VR眼镜的标配功能外,Q-Glass还能实现眨眼抢红包.听起来是不是很酷炫?上市时间可要在10年后.不过,2016年底支付宝首推AR实 ...
- java虚拟机(二)--类加载机制和双亲委派模型
一.类的生命周期 加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸 ...
- 对vuex的一点理解
vuex是vue.js的一个状态管理工具,它适用于解决平行组件之间的数据共享问题.一般情况下,我们更多的是父子组件之间通过props或$emit来实现传值,如何不满足以上情况那只有使用vuex进行解决 ...
- [转]SSD固态存储大观(一)
From: http://blog.51cto.com/alanwu/1405874 Contents 1.概述... 1 2.FusionIO:Pcie SSD的始作俑者... 2 3.Intel ...
- 巩固JavaSE基础--IDEA完成实战项目
PS:学习完JavaSE基础后,需要有一个项目来测试自己的学习成果,并加以巩固.所以在这里,就让我们来学习下“一本糊涂账”项目吧.(此项目来源于Java自学网站) 项目完成效果图一览
- Spring资源访问接口Resource
该接口拥有对不同资源类型的实现类 boolean exists() 资源是否存在 boolean isOpen() 资源是否打开 URL getURL() 如果底层资源可以表示成URL,则该方法返回对 ...