面试题四十:数组中最小的k个数
方法一:先排序后寻找前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个数的更多相关文章
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 求一个数组中最小的K个数
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
/** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...
- [算法]找到无序数组中最小的K个数
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...
- 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数
题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...
- 《剑指offer》第四十题(最小的k个数)
// 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8 // 这8个数字,则最小的4个数字是1.2.3.4. #include < ...
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 求数组中最小的k个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.Arra ...
- [剑指offer]数组中最小的K个数,C++实现
原创博文,转载请注明出处! http://github.com/wanglei5205 http://cnblogs.com/wanglei5205 # 题目 输入n个整数,找出其中最小的K个数.例如 ...
- 找到数组中最小的k个数
/*输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字, 则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = ...
随机推荐
- 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...
- Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
- Python3笔记010 - 3.1 程序结构
第3章 流程控制语句 3.1 程序结构 程序设计的基本结构: 顺序结构---顺序执行所有语句 选择结构---选择执行部分语句 循环结构---循环执行部分语句 1.顺序结构 按照顺序执行语句. 2.选择 ...
- Java编程资料
Java相关免费编程书籍推荐(都是PDF版) 编程进阶 2017年9月11日 IDE IntelliJ IDEA 简体中文专题教程 https://github.com/judasn/IntelliJ ...
- css中 出现height为100%失效的原因及解决方案
我们都知道需要给html和body标签设置了高度height:100%之后,再给内部的div设置height:100%的时候,内部div的高度100%才会起到作用.这是由于:%是一个相对父元素计算得来 ...
- 总结几个移动端H5软键盘的大坑
1.部分机型软键盘弹起挡住原来的视图 解决方法:可以通过监听移动端软键盘弹起 Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内.参数如下. true,表示 ...
- css如何将图片横向平铺?
在CSS中,可以使用background(背景)属性来添加图片,默认图片是向x轴和y轴重复.那么css如何将图片横向平铺?下面本篇文章就来给大家介绍一下使用CSS将图片横向平铺的方法,希望对大家有所帮 ...
- Instrction Arrangement UDH 4109 拓扑排序 or 最长路
题目描述 Ali has taken the Computer Organization and Architecture course this term. He learned that ther ...
- 简单了解一下 Swagger
一.Swagger 1.什么是 Swagger ? Swagger 是一个规范和完整的框架,用于生成.描述.调用以及可视化的 Restful 风格的 Web 服务. 简单的理解:是一款 REST AP ...
- 一文说通Blazor for Server-Side的项目结构
用C#代替Javascript来做Web应用,是有多爽? 今天聊聊 Blazor. Blazor 是一个 Web UI 框架.这个框架允许开发者使用 C# 来创建可运行于浏览器的具有完全交互 UI ...