方法一:先排序后寻找前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. Java是如何实现Future模式的?万字详解!

    JDK1.8源码分析项目(中文注释)Github地址: https://github.com/yuanmabiji/jdk1.8-sourcecode-blogs 1 Future是什么? 先举个例子 ...

  2. asp.net Core依赖注入(自带的IOC容器)

    今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库. 在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码. 比如,在我们的 ...

  3. STL标准函数库学习小总结

    浅谈STL(未完)前言:(1)学习资料——<算法笔记>第六章.<常用基础数据结构>文档 (2)测试平台——Codeup新家(<算法笔记>对应OJ).洛谷.YCOJ ...

  4. Python-使用百度文字识别API实现的文字识别工具

    import requests import base64 import keyboard import mouse import time import os from PIL import Ima ...

  5. P1004 方格取数——奇怪的dp

    P1004 方格取数 题目描述 设有 \(N\times N\) 的方格图 \((N\leq 20)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 \(0\) .如下图所示(见样例) ...

  6. 状压DP之炮兵阵地

    题目 原题来自:\(NOI 2001\) 司令部的将军们打算在\(N*M\) 的网格地图上部署他们的炮兵部队.一个\(N*M\)的地图由\(N\)行\(M\)列组成,地图的每一格可能是山地(用 H表示 ...

  7. 点分治模板 POJ 1741

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...

  8. BZOJ1294 洛谷P2566 状态压缩DP 围豆豆

    传送门 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值 ...

  9. Django---进阶3

    目录 无名有名分组反向解析 路由分发 名称空间(了解) 伪静态(了解) 虚拟环境(了解) django版本区别 视图层 三板斧 JsonResponse对象 form表单上传文件及后端如何操作 req ...

  10. Linux超强截图工具flameshot

    Pop!_OS自带的截屏快捷键如下 但讲道理这个是真的不好用 所以我们借助第三方的截图工具,这里推荐flameshot(火焰截图) 在终端键入以下命令即可安装 sudo apt update sudo ...