当前位置: 首页 > news >正文

输入n个整数,输出其中最小的k个

/**
 * 题目:输入n个整数,输出其中最小的k个。
 * 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
 * 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。
 * 题目并没有要求要查找的k个数,甚至后n-k个数是有序的,既然如此,咱们又何必对所有的n个数都进行排序列?
       这时,咱们想到了用选择或插入排序,即遍历n个数,先把最先遍历到得k个数存入大小为k的数组之中,对这k个数,进行排序,找到k个数中的最大数kmax,
  k1<k2,K3<…<kmax(kmax设为k个元素的数组中最大元素),用时O(k),后再继续遍历后n-k个数,x与kmax比较,如果x<kmax,则x代替kmax,并再次排序k个元素的数组。如果x>kmax,则不更新数组。
       这样,每次更新或不更新数组的所用的时间为O(k)或O(0),整趟下来,总的时间复杂度平均下来为:n*O(k)=O(n*k)。
3、  当然,更好的办法是维护k个元素的最大堆,原理与上述第3个方案一致,即用容量为k的最大堆存储最小的k个数,此时,k1<k2<...<kmax(kmax设为大顶堆中最大元素)。
遍历一次数列,n,每次遍历一个元素x,与堆顶元素比较,x<kmax,更新堆(用时logk),否则不更新堆。这样下来,总费时O(n*logk)。此方法得益于在堆中,查找等各项操作时间复杂度均为logk(不然,就如上述思路2所述:直接用数组也可以找出前k个小的元素,用时O(n*k))。
 */
public class MinK {

	/**
	 * 
	 * @param krr
	 * @param k
	 * @return
	 */
	public static int[] minK(int krr[],int k){
		int arr[] = new int[k];
		for(int i = 0;i<k;i++)
			arr[i] = krr[i];
		buildHeap(arr);
		for(int j = k;j<krr.length;j++){
			if(krr[j]<arr[0]){
				arr[0] = krr[j];
				maxHeap(arr,1,k);
			}
		}
		return arr;
	}
	/**
	 * 建最大堆
	 * @param arr
	 */
	public static void buildHeap(int arr[]){
		int heapsize = arr.length;
		for(int i=arr.length/2;i>0;i--)
			maxHeap(arr,i,heapsize);
	}
	/**
	 * 调整为最大堆
	 * @param arr
	 * @param i
	 * @param heapsize
	 */
	public static void maxHeap(int arr[],int i,int heapsize){
		int largest = i;
		int left = 2*i;
		int right = 2*i+1;
		if(left<=heapsize&&arr[i-1]<arr[left-1])
			largest = left;
		if(right<=heapsize&&arr[largest-1]<arr[right-1])
			largest = right;
		if(largest!=i){
			int temp = arr[i-1];
			arr[i-1] = arr[largest-1];
			arr[largest-1] = temp;
			maxHeap(arr,largest,heapsize);
		}
	}
	public static void main(String[] args) {
		int krr[] = {1,3,4,2,7,8,9,10,14,16};
		int arr[] = minK(krr,4);
		for(int i =0;i<arr.length;i++)
			System.out.println(arr[i]);

	}

}


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • cocos2dx 3.x 精灵重叠时点击最上层的精灵
  • 输入一个整型数组,求所有子数组中和的最大值
  • 软件测试知识之分类
  • 算法导论学习笔记——贪心算法
  • web前端开发浏览器兼容性处理大全
  • 算法导论学习笔记——动态规划
  • Google技术学习
  • 【无聊放个模板系列】 半平面交
  • 最长公共子序列(LCS)问题
  • 01背包问题
  • JS控制文本框只能输入中文、英文、数字与指定特殊符号.
  • iOS僵尸对象之研究
  • 在一个大数组中有且仅有两个数相同,怎样尽快找出这两个数(未完成)
  • 字符串匹配算法
  • CXF:根据werservice代码生成WSDL(转)
  • java第三方包学习之lombok
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SQL 难点解决:记录的引用
  • sublime配置文件
  • Vue组件定义
  • 编写符合Python风格的对象
  • 从零开始学习部署
  • 大型网站性能监测、分析与优化常见问题QA
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 使用 @font-face
  • 学习JavaScript数据结构与算法 — 树
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #数据结构 笔记三
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (java)关于Thread的挂起和恢复
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三) diretfbrc详解
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .Net Core 中间件与过滤器
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET简谈设计模式之(单件模式)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @Transactional 竟也能解决分布式事务?
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [<MySQL优化总结>]
  • [100天算法】-不同路径 III(day 73)
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [Android View] 可绘制形状 (Shape Xml)