求给定数据中最小的K个数
public class MinHeap {
/*
*
* Top K个问题,求给定数据中最小的K个数
*
* 最小堆解决:堆顶元素为堆中最大元素
*
*
*
*/
private int MAX_DATA = 10;//最小10个数
private int[] data;//存储数据
private int len;//当前存储长度,考虑到元素个数可能没有10个,这个时候全部输出
private MinHeap() {
data = new int[MAX_DATA];
len=0;
}
private MinHeap(int max) {
this.MAX_DATA = max;
data = new int[MAX_DATA];
len=0;
}
public void setRoot(int root) {
this.data[0] = root;
}
public void addData(int da) {
if (this.len < this.MAX_DATA)
{
this.data[this.len] = da;
len++;
if(len==this.MAX_DATA)
this.adjust(0);
}
else if(da<this.getRoot())
{
this.setRoot(da);
this.adjust(0);
}
}
private void adjust(int index)
{
int left=index*2+1;
int right=index*2+2;
if(left<this.len&&right<(this.len)&&data[index]>=data[left]&&data[index]>=data[right])
return;
if(left<this.len&&data[index]<data[left])
{
data[index]^=data[left];//两个数交换
data[left]^=data[index];
data[index]^=data[left];
this.adjust(left);
}
if(right<(this.len)&&data[index]<data[right])
{
data[index]^=data[right];
data[right]^=data[index];
data[index]^=data[right];
this.adjust(right);
}
}
private int getRoot()
{
return this.data[0];
}
public String toString()
{
for(int i=0;i<this.len;i++)
System.out.print(data[i]+"/");
return null;
}
public static void main(String args[])
{
MinHeap min=new MinHeap();
for(int i=200;i>0;i--)
{
min.addData(i);
min.toString();
System.out.print("\n");
}
}
}
求给定数据中最小的K个数的更多相关文章
- 【剑指offer】求一组数据中最小的K个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...
- 求一个数组中最小的K个数
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...
- [算法]找到无序数组中最小的K个数
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
/** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...
- 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数
题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- 求数组中最小的k个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.Arra ...
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
随机推荐
- GPS(Global Positioning System)全球定位系统
GPS构成: 1.空间部分 GPS的空间部分是由24 颗工作卫星组成,它位于距地表20 200km的上空,均匀分布在6 个轨道面上(每个轨道面4 颗) ,轨道倾角为55°.此外,还有4 颗有源备份卫星 ...
- Hibernate初级
文章来源: http://blog.csdn.net/jiuqiyuliang/article/details/39078749/ 持久化(Persistence),把数据(如内存中的对象)保存到可永 ...
- iOS开发之静态库.a的制作教程
第一种方法:直接新建一个工程. 1.新建项目-> 选择 “Cocoa Touch Static Library” 2.添加库需要包含的源代码,将你工程里的代码添加到打静态库工程里: 3.配置一下 ...
- 自定义控件(视图)1期笔记02:View的绘制流程
1. 引言: 来自源码的3个方法: (1)public final void measure():测量,用来控制控件的大小,final不建议覆写 (2)public void layout():布局, ...
- Android-Opencv开发(一)配置环境
先去官网下载android-opencv http://opencv.org/.
- Java阻塞中断和LockSupport
在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? ...
- 用fiddler工具做接口测试
接口测试的原理我理解很简单,是你发送数据,看返回数据是否正确,返回值类型是否正常,主要点是多种数据的,返回结果正常 和其他应用程序相同,java中需要知道你的参数,字段有哪些,我们就去给他造数据,而先 ...
- Flash cs6 如何从FLA 文件导出sound文件
Flash. How to export sound from the FLA file extract sound from a fla 第一个是图文教程,在下面还有"watch vide ...
- MongoDB基本操作
转:http://zhidao.baidu.com/link?url=D5s4tNnP6hH0XPZkFooV-o4MQH3pNZh7C3rtLX_HtVWaIyBRhLIUyoZYfVv15l2eS ...
- MySQL 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기
alter table 을 이용해서 기존의 생성된 테이블의 타입(Heap, MyIsam, InnoDB...)을 변경하는 명령어 입니다. 잠시 까먹은 분은 계실지 몰라도 원래 모르는 ...