面试题四十:数组中最小的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 = ...
随机推荐
- Spring Boot2+Resilience4j实现容错之Bulkhead
Resilience4j是一个轻量级.易于使用的容错库,其灵感来自Netflix Hystrix,但专为Java 8和函数式编程设计.轻量级,因为库只使用Vavr,它没有任何其他外部库依赖项.相比之下 ...
- Spring Boot2.x 的Druid连接池配置[附带监控]
父依赖[Spring Boot 2.1.x版本] <parent> <groupId>org.springframework.boot</groupId> < ...
- java语言基础(五)_Scanner类_Random类_ArrayList类
API API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典 ,是JDK中提供给程序员使用的类的说明文档.这些类将底层的代 ...
- JavaScript之DOM的增删改查
JavaScript的组成: 1. ECMAScript-语法规范 2. Web APIs(浏览器提供的工具) (1).BOM (浏览器对象模型) (2).DOM (文档对象模型) 今天就来讲讲DOM ...
- 线性DP之免费馅饼
题目 思路 线性DP,思路很容易就能想到,f[i][k]数组定义为第i秒在k位置时从上一位置j转移过来的最优解,易得f[i][k]=max(f[i][k],f[i-1][j]+search(i,k)) ...
- POJ - 3463 Sightseeing 最短路计数+次短路计数
F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...
- Jenkins 自动化(CI/DI)部署
1. 背景介绍 在实际开发中,经常要一边开发一边测试,经常为了一个功能而不断更新版本,这些情况都会涉及到频繁的打包.部署:手动打包的涉及到项目上传.打包.发布等很多重复工作: 那么,有一种工具能够实现 ...
- 日期推算:datetime
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2020, 5, 20, 23, ...
- EntityFrameworkCore 开发实践问题及规范
严重问题 客户端求值 如where条件包含的GetValueOrDefault()不能被翻译成sql语句 不规范代码段例子 public async Task<List<Person> ...
- 记Centos7和RHEL连接不上网络
一 .前言 我是把Linux系统安装在虚拟机中的,用的是VMware. 在终端工具和操作界面中. VMware里面采用的网络适配器是NAT技术. 标题中的Centos和RHEL区别就不多说了,自行百度 ...