问题:输入n个整数,找出其中最小的k个数。

方案一:将输入的n个整数进行排序,输出前k个数即为所求的k个最小数。时间复杂度为O(nlogn).

方案二:创建一个大小为k的容器,来存储最小的k个数。遍历剩下的n-k个数字,如果大于k个数中的最大值,则替换;否则继续遍历数组的剩  下的数字。

  在装k个最小数字的容器(使用大根堆)中,所要做的操作有以下三个:

  (1)在k个整数中找到最大的值;(时间复杂度为O(1),根节点即为最大值点)

  (2)在这个容器中删除最大的数字;

  (3)将可能要插入的值插入到容器中。(插入和删除的时间复杂度为O(logk))

总共有n个节点,则总的时间复杂度为O(nlogk)。

package com.wyl;
/**
* 找到数组中的k个最小值
* @author wyl
*/
public class KMin {
/**
* 找到数组array中最下的k个数
* 思路:将数组的前K个数当作最小的k个数,存入到数组2中,
* 遍历array中剩余的n-k个数,如果比数组2中的最大数字小,替换数组2中的数字;
* 比其大继续遍历,最后数组2中存放的即为最小的k个数
* @param array
* @param k
* @return
*/
public void findKMin(int[] array, int k){
if(array.length < k){
return;
}
int[] newArray = new int[k];
for(int i=0;i<k;i++){ //前k个数字存入数组中
newArray[i] = array[i];
}
//将数组调整成大根堆,k/2为堆的最后一个非叶节点
for(int i = k/2 - 1;i>=0;i--){
//最后一个非叶节点的下标为n/2-1
rebuildHeap(newArray, i, k);
} //n-k个数和前面和k中最大数比较
for (int i =k; i < array.length; i++) {
//如果堆顶大于n-k中数,则交换位置
if(newArray[0]>array[i]){
newArray[0]=array[i];
//调整堆,堆顶被替换了,加入被替换的值非常小,会一直下沉到叶子节点.
for(int j = k/2 - 1;j>=0;j--){
//最后一个非叶节点的下标为n/2-1
rebuildHeap(newArray, j, k);
}
} }
// 输出最小的K个数
for (int i = 0; i < k; i++) {
System.out.print(newArray[i] + " ");
}
}
/**
* 调整堆
* @param a
* @param i
* @param n
*/
public void rebuildHeap(int[] a, int i, int n){
if(n <= 0){
return;
}
int temp = a[i]; //待调整节点
boolean finish = false; //调整完成标志
int li = 2 * i + 1; //左节点下标
while(li <= n - 1 && !finish){
if(li < n - 1 && a[li] < a[li+1]){ //节点存在右子树,且右子树值大于左子树
li = li+1;
}
if(temp < a[li]){ //待调整节点值小于子树值,继续调整子树
a[i] = a[li];
a[li] = temp;
}else{
finish = true;
}
}
} public static void main(String[] args) {
KMin kMin = new KMin();
int[] array = {4,5,1,6,3,8,7,9};
kMin.findKMin(array, 4);
}
}

  

数组中的k个最小值的更多相关文章

  1. 前端算法题:找出数组中第k大的数字出现多少次

    题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...

  2. [LeetCode] Kth Largest Element in an Array 数组中第k大的数字

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  3. 如何使用Math对象快速计算数组中的最大值或最小值

    Math 对象下包含 min() 和 max() 方法 用于确定一组数值中的最大值和最小值.这两个方法都可以接收任意多个数值参数. var max = Math.max(1,2,3,4,5,6); c ...

  4. 数组中第K小的数字(Google面试题)

    http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...

  5. #7 找出数组中第k小的数

    「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...

  6. C#获取一个数组中的最大值、最小值、平均值

    C#获取一个数组中的最大值.最小值.平均值 1.给出一个数组 ,,,,,-,,,,}; 2.数组Array自带方法 本身是直接可以调用Min(),Max(),Average()方法来求出 最小值.最大 ...

  7. Javascript获取数组中的最大值和最小值的方法汇总

    比较数组中数值的大小是比较常见的操作,下面同本文给大家分享四种放哪广发获取数组中最大值和最小值,对此感兴趣的朋友一起学习吧   比较数组中数值的大小是比较常见的操作,比较大小的方法有多种,比如可以使用 ...

  8. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  9. 选择问题(选择数组中第K小的数)

    由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小 ...

随机推荐

  1. centos下apache安装

    ./configure --prefix=/usr/local/apache2 --enable-so --enable-proxy --enable-proxy-connect --enable-p ...

  2. centos7 设置mongodb远程连接

    /etc/mongod.conf 更改 bindIp: 127.0.0.1 为 bindIp: 0.0.0.0

  3. 除去DataTable中的空行!

    昨天向数据库中导入Excel数据时  由于空行 总是报错!下面附上两种去除空行的方法! 方法一.某行某列值为空时 DataView dv = dt.DefaultView;              ...

  4. 0701-spring cloud config-简介、Config Server开发、Config Client开发

    一.概述 参看地址: https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_spring_ ...

  5. 【转载】ARM MMU详解

    一.MMU的产生       许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以 ...

  6. 如何高效的遍历HashMap 以及对key 进行排序

    Map<Integer ,Object> map = new HashMap<Integer,Object>(); for(int i = 0; i<=100;i++){ ...

  7. Paper List ABOUT Deep Learning

    Deep Learning 方向的部分 Paper ,自用.一 RNN 1 Recurrent neural network based language model RNN用在语言模型上的开山之作 ...

  8. 金融即服务(FaaS),将开启场景化金融新格局

    转自: https://www.iyiou.com/p/28494/fs/1 [ 亿欧导读 ] 金融即服务揭示了场景金融的实现路径,通过双向连接做一个开放的系统,按需给客户提供金融服务. 本文系作者在 ...

  9. 20145316许心远《Java学习笔记(第8版)》课程总结

    20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...

  10. LNMP环境简单教程

    一:LNMP可以进行简单优化,主要2方面.NGINX和PHP进程数,分别是以下2个文件: 1. /usr/local/nginx/conf/nginx.conf2. /usr/local/php/et ...