当前位置:   article > 正文

Java算法篇在一个int数组中寻找最大的k个数字_java中寻找最大的k个数解法

java中寻找最大的k个数解法

背景

在一个int数组中,寻找最大的k个数字,时间复杂度是O(n)。

数组不大情况下

思路:

  • 类似于基本排序中的基数排序,利用空间换时间,待排序数组的值是新数组的索引,新数组的值就是出现的次数,考虑重复的情况
  • 新数组如果值为空,则表示这个索引值在原来数组根本不存在,如果大于1则该数字在原来数组出现多次

第一步:

找到原数组最大值,利用比较计算

第二步:

新建数组,size是第一步中的最大值+1;

第三步:

循环原来数组,利用temp[a[i]]++,计算索引表示的数字在原数组出现次数

第四步:

倒序遍历新的数组,如果元素值不为0,打印下标,循环打印,直到数组值为0,并计算打印的元素个数count++,直到count等于k,完成输出

  1. package com.puhui.goosecard.web;
  2. /**
  3. * 2 * @Author: kerry
  4. * 3 * @Date: 2018/9/6 19:45
  5. * 4
  6. */
  7. public class Test {
  8. private static int searchMax(int[] temp) {
  9. int max = temp[0];
  10. for (int i = 0; i < temp.length; i++) {
  11. if (temp[i] > max) {
  12. max = temp[i];
  13. }
  14. }
  15. return max;
  16. }
  17. public static void main(String[] args) {
  18. int[] a = {1, 4, 12, 8, 6, 98, 3, 4, 1, 12};
  19. int max = searchMax(a);
  20. int k = 5;
  21. //max加1否则是0-97,数组越界98
  22. int[] temp = new int[max + 1];
  23. for (int i = 0; i < a.length; i++) {
  24. //可能有相同的数字
  25. temp[a[i]]++;
  26. }
  27. int count = 0;
  28. for (int j = max; j >= 0; j--) {
  29. if (count == k) {
  30. break;
  31. }
  32. //可能有相同的所以不用if,用while
  33. while (temp[j] > 0) {
  34. count++;
  35. System.out.println(j);
  36. temp[j]--;
  37. }
  38. }
  39. }
  40. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/295205
推荐阅读
相关标签
  

闽ICP备14008679号