求给定数据中最小的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在很多情 ...
随机推荐
- 文件I/O(不带缓冲)之I/O的效率
程序清单3-3中的程序使用read和write函数复制文件.关于该程序应注意下列各点: 它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入.输出已由shell安排好.确实,所有常用的 ...
- HTTP 无法注册 URL http://+:12345/HelloWcfService/。进程不具有此命名空间的访问权限
运行的时候却发现出如下问题:HTTP 无法注册 URLhttp://+:12345/HelloWcfService/.进程不具有此命名空间的访问权限(有关详细信息,请参见http://go.micro ...
- JS与OC交互--简单使用
直接上代码 .m文件 #import "ViewController.h" @interface ViewController () <UIWebViewDelegate&g ...
- Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈
1. TCP协议上传图片并给出反馈: (1)客户端: package cn.itcast_13; import java.io.BufferedInputStream; import java.io. ...
- sscanf、strsep
#include <stdio.h> #include <string.h> int main() { char token[] ="abdzxbcdefgh&quo ...
- UTF-8编码与Unicode CS2的转换
/* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...
- CSS选择器优先级
1.类的覆盖顺序和应用的时候引用的顺序没关系,覆盖顺序取决于类定义的顺序 例如: .a{ color:red } .b{ color:green } 由于b晚于a定义,所以b覆盖a,反 ...
- MyBatis5:MyBatis集成Spring事务管理(上篇)
前言 有些日子没写博客了,主要原因一个是工作,另一个就是健身,因为我们不仅需要努力工作,也需要有健康的身体嘛. 那有看LZ博客的网友朋友们放心,LZ博客还是会继续保持更新,只是最近两三个月LZ写博客相 ...
- uiatuomator提示shortMsg=java.lang.RuntimeException
自动化要做断言,原本打算使用的testng,因为它断言后就能出结果,还能生成报告,但是在实践过程中,硬是没有成功,所以还是放弃,使用的junit,后面使用的cts框架生成的邮件,现在记录使用junit ...
- 【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组
[转]ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.l ...