package com.Test;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;//给定一个长度为n的数组,寻找其中最大的k个数
public class FindKthElements {//算法一:排序,时间复杂度O(nlogn),空间复杂度O(1)public ArrayList<Integer> findKthElements(int[] arr, int k) {ArrayList<Integer> res = new ArrayList<Integer>();if(arr.length <= 0 || arr == null || arr.length < k) {return res;}Arrays.sort(arr);for(int i = arr.length - 1;i > arr.length - 1 - k;i --) {res.add(arr[i]);}return res;}//算法二;前面k个数都比后面的数的最大值要大,则前面k个数就是最大的k个,时间复杂度O(k*(n-k)),空间复杂度O(1)public ArrayList<Integer> findKthElements2(int[] arr, int k) {ArrayList<Integer> res = new ArrayList<Integer>();if(arr.length <= 0 || arr == null || arr.length < k) {return res;}for(int i = 0;i < k;i ++) {int maxValueIndex = this.getMaxValueIndex(arr, k);if(arr[maxValueIndex] > arr[i]) {int temp = arr[maxValueIndex];arr[maxValueIndex] = arr[i];arr[i] = temp;}}for(int i = 0;i < k;i ++) {res.add(arr[i]);}return res;}//选择排序:选出最大值的下标public int getMaxValueIndex(int[] arr, int k) {int maxValueIndex = k;for(int i = k + 1;i < arr.length;i ++) {if(arr[i] > arr[maxValueIndex]) {maxValueIndex = i;}}return maxValueIndex;}//算法三:构建大顶堆,然后调整k次,得到最大的k个数。时间复杂度(k+1)O(nlogn),空间复杂度O(1)public ArrayList<Integer> findKthElements3(int[] arr, int k) {ArrayList<Integer> res = new ArrayList<Integer>();if(arr.length <= 0 || arr == null || arr.length < k) {return res;}//构建大顶堆int len = arr.length;for(int i = len / 2;i < len;i ++) {heapSort(arr, i, len);}//调整k次大顶堆for(int i = arr.length - 1;i > arr.length - 1 - k;i --) {//交换最大的值到底部int temp = arr[i];arr[i] = arr[0];arr[0] = temp;res.add(arr[i]);heapSort(arr, 0, i);}return res;}public void heapSort(int[] arr, int start, int len) {int parent = start;int leftChild = parent * 2 + 1;int parentValue = arr[parent];while(leftChild < len) {int rightChild = leftChild + 1;if(rightChild < len && arr[leftChild] < arr[rightChild]) { //在左右孩子里选一个较大的出来leftChild = rightChild;}           if(parentValue > arr[leftChild]) {break;}arr[parent] = arr[leftChild];parent = leftChild;leftChild = parent * 2 + 1;}arr[parent] = parentValue;}public static void main(String[] args) {int[] arr = {9,4,5,8,2};FindKthElements fke = new FindKthElements();List<Integer> res = fke.findKthElements3(arr, 3);System.out.println(res);}
}

三种方法寻找数组前K个最大的数相关推荐

  1. html怎么创建数组,js创建数组的三种方法 JS数组去重的几种常见方法

    JS数组有哪几种定义方式? js 里创建一个数组 那几种方式有什么区别吗?a = new Array(); b = []; 性能问题吗?? function clear(arr) { // 1 如何获 ...

  2. c语言三种方法求n的k次方

    // 方法一:递归 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int Pow ...

  3. 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)

    寻找数组第K大数是大厂面试中经常考到的一题,有的小机灵鬼直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱.面试官希望看到的是你对算法的理解,而不是函数的调用.下面,我就以 ...

  4. matlab创建三维数组的三种方法

    在Matlab中习惯性的会将二维数组中的第一维称为"行"第二维称为"列",而对于三维数组的第三位则是习惯性的称为"页".在Matlab中将三 ...

  5. 易语言删除数组里的指定成员的三种方法

    我们想从从数组里删除指定成员的时候,首先要遍历数组, 找到对应的成员名称,然后使用删除成员命令来删除.以下提供了三种思路. 方法一: 窗口程序集名 保 留 保 留 备 注 窗口程序集1 子程序名 返回 ...

  6. Java声明数组的三种方法

    目录 前言 内容 后记 前言: 这篇主要讲java的三种数组声明方式,这里采用String类型作为典型 内容: package com.izaijia; //数组的三种声明形式 public clas ...

  7. php遍历数组哪个效率高,PHP遍历数组的三种方法及效率对比分析

    PHP遍历数组的三种方法及效率对比分析 发布于 2015-03-04 21:55:27 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

  8. php数组如何写入txt文件中_php将数组写入到文件的三种方法

    php的数组十分强大,有些数据不存入数据库直接写到文件上,用的时候直接从文件中读取,本文章向大家介绍php将数组写入到文件的三种方法. 第一:serialize方法 使用 serialize 将数组序 ...

  9. (PASS)JAVA数组去重 三种方法 (不用集合)

    第一种方法(只学到数组的看): 定义一个新的数组长度和旧数组的长度一样,存储除去重复数据的旧数组的数据和0, package demo01;import java.sql.Array; import ...

最新文章

  1. KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?...
  2. python好学嘛-Python对于没有计算机基础知识的人来说,好学吗?
  3. final,finally和finalize的区别
  4. android优化最强软件,最强大的安卓优化工具诞生,让手机流畅度提升75%
  5. Spring的properties属性配置文件和Spring常用注解
  6. 【记录】利用jar包制作docker镜像
  7. Q96:PT(2):纹理的仿射变换(Textures And Transformations)
  8. 3. 什么是icmp?icmp与ip的关系_0.3亿人口的美国会比3亿人口的美国富裕吗?
  9. 关于util.Date,sql.Date,sql.Time,sql.Timestamp以及他们和Clendar类的区别和联系
  10. 华为经典面试题(敲黑板!!!)
  11. linux intel显卡驱动下载,下载 英特尔®显卡 BETA WSL Windows® 10 DCH 驱动程序
  12. VS2003安装包和方法
  13. java编写singleton程序_java – 在Singleton实现中初始化按需成语与简单静态初始化程序...
  14. 手机连接笔记本开启的WiFi一直显示正在获取IP中
  15. ZGC-一款为开拓JAVA新疆土的垃圾回收器
  16. android 墨迹天气背景,GitHub - xiangzhihong/android: 仿墨迹天气折线,以及背景滚动效果...
  17. 面向气象灾害预警信息的5G网络切片技术研究
  18. Springboot+爬虫+推荐算法+前后端分离实现小说推荐系统
  19. linux 超级作用域,linux dhcp超级作用域配置
  20. 信息安全系统设计基础_exp2

热门文章

  1. JUNIPER 升级
  2. Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务
  3. diff = (diff*255).astype(“uint8“)
  4. 【训练题22:线性求逆元】【模板】乘法逆元 | 洛谷 P3811
  5. 四种常见的 POST 提交数据方式对应的 content-type 取值
  6. 我的2018——上懂机器学习,下懂微信建群
  7. 软件自动化测试订飞机票,用 Selenium 搞定自动化测试项目,途牛搜机票。
  8. 边际效用递减和需求曲线下降
  9. 计算机上网的用户账号怎么查询,自己的宽带账号怎么查
  10. 实验4-2-2 求e的近似值 (15分)