方法一:先排序后寻找前k个数;
方法二:受面试题三十九,寻找超过一半的数的启发,只把里面的middle改成k-1就行;

void HalfNum( int [ ] Array ,int k){

             int start=0;
int end=Array.length-1;
int index=Patition(Array ,start ,end);
//不求排序,只求不断向中间靠近
while(index!=k){
if(index>k){
end=index-1;
}
else
start=index+1;
index=Patition(Array ,start ,end)
}    
for(int i=0;i<k;i++) {
System.out.print(Array[i]+" ");
}
System.out.println();
} int Patition( int [] a,int be,int end){
int inter=a[be];//把起始位置作为主元
int L=be+1;
int R=end;
int b;
while(L<=R)///数组都遍历完了即R与L交错时停止循环
{
while(L<=R&&inter>=a[L]) L++;
while(L<=R&&inter<a[R]) R--;
if(L<R)
{b=a[L]; a[L]=a[R]; a[R]=b;}
///交换位置,把比主元大的放后面 ,比主元小的放前面
}
a[be]=a[R];a[R]=inter;///交换位置把主元放进去作为间隔
return R;
}

方法三:适合处理**海量的数据**,创建一个大小为k的容器,首先填满,再寻找最大值,比较替换;

 void  MinK(int[] Array,int k) {
         int[] A_k = new int[k]; //K堆的大小开辟空间
         int i=0;
         //填满K堆
         while(i<k){
              A_k[i] = Array[i];
              i++;
         }
         BuildHeap(A_k);//建堆      
         while(i<Array.length) {
              if(Array[i]<A_k[0]) {
                  A_k[0]=Array[i];
                  Heapify(0, A_k);/// 调堆
              }
              i++;
         }
         for(int j=0;j<k;j++) {
System.out.print(A_k[j]+" ");
}
System.out.println();
     }      // 建堆,二叉树用数组表示:根节点下标为n=0;左子树为2n+1,右子树为2n+2;求父节点则为(n-1)/2
     public static void BuildHeap(int[] Array) {
         //找到最后一个非叶子节点开始,自底向上调整
         for(int i=Array.length/2-1;i>=0;i--)
              Heapify(i, Array);
         
     }        // 调堆,就是把最大值最为根节点i
//以i为根节点建立大顶堆
     public static void Heapify(int i,int[] Array){
         int left = i*2+1;//左孩子
         int right = i*2+2;//右孩子
         //寻找最大值下标
         int biggest = i;
         if(left < Array.length && Array[left]>Array[i]
              biggest = left;
         if(right<Array.length && Array[biggest]<Array[right])
              biggest = right;          //如果根节点就是最大,那么下面的子树就不用管
         if(i == biggest)    return;          //否则两个值交换后,调整下面交换后的堆
         int temp = Array[i];
         Array[i] = Array[biggest]
         Array[biggest] = temp;     
         Heapify(biggest, Array);      }

面试题四十:数组中最小的k个数的更多相关文章

  1. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  2. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

  3. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    /** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...

  4. [算法]找到无序数组中最小的K个数

    题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...

  5. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  6. 《剑指offer》第四十题(最小的k个数)

    // 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8 // 这8个数字,则最小的4个数字是1.2.3.4. #include < ...

  7. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  8. 求数组中最小的k个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.Arra ...

  9. [剑指offer]数组中最小的K个数,C++实现

    原创博文,转载请注明出处! http://github.com/wanglei5205 http://cnblogs.com/wanglei5205 # 题目 输入n个整数,找出其中最小的K个数.例如 ...

  10. 找到数组中最小的k个数

    /*输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字, 则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = ...

随机推荐

  1. 利用xampp集成环境搭建pikachu靶场及部分问题解决

    xampp的环境部署 1.本地服务器的搭建 首先要到官网下载xampp https://www.apachefriends.org/zh_cn/index.html 有各个不同的系统版本,这里我们选择 ...

  2. CListCtrl 控件即使跟新数据,即时刷新以及属性设置

    用 m_CtrItem.Update( i );来即使跟新每行的数据,因为有时用某些函数如SetItemText()来设置某一行一列的数据是,控件上面的显示数据没有即使跟新,这是就有update来跟新 ...

  3. Mac下搭建react开发环境

    安装node 官网下载 https://nodejs.org/en/ 双击安装,接下来都是默认选择即可,直至安装成功 测试是否安装成功,分别输入以下命令: node -v npm -v 如下图所示,说 ...

  4. LeetCode第29场双周赛题解

    第一题 用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值. class Solution { public: doub ...

  5. 轻松搞定安全框架(Shiro)

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  6. Python必须知道的异常处理

    异常处理 把可能会发生的错误,提前在代码里进行捕捉(监测) try : code except Exception: 出错后要执行的代码 下面是常见的异常: attributeError 试图访问一个 ...

  7. 反转链表(剑指offer-15)

    方法1:递归 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...

  8. Bash的特性

    Bash的特性 1. tab补全 #命令补全 [root@clf ~]# user  #命令补全useradd     userdel     usermod     usernetctl  user ...

  9. Java 添加条码、二维码到Word文档

    本文介绍如何在Word文档中添加条码.二维码.可在文档正文段落中添加,也可在页眉页脚中添加.下面将通过Java代码示例介绍如何实现. 使用工具:Free Spire.Office for Java(免 ...

  10. Jetbranis学习资料之全家桶

    相信很多小伙伴,用的代码编辑器很多都是Jetbrains的,但好东西不可能免费的,而且找了很多激活码都是失效总是莫名其妙的就过期了.下面分享一个不错的激活码地址,比其他的应该更加可靠.本人实测目前支持 ...