一、题目内容

image.png

二、题解

解法1:

思路

求Top,小顶堆;求Min 大顶堆

代码

  1. public class Solutiong {
  2. /**
  3. * return topK string
  4. *
  5. * @param strings string字符串一维数组 strings
  6. * @param k int整型 the k
  7. * @return string字符串二维数组
  8. */
  9. private static HashMap<String, Integer> map = new HashMap<String, Integer>();
  10. public static String[][] topKstrings(String[] strings, int k) {
  11. // write code here
  12. //str,count
  13. for (String str : strings) {
  14. int count = map.getOrDefault(str, 0);
  15. map.put(str, count + 1);
  16. }
  17. List<String> strSet = new ArrayList<>(map.keySet());
  18. String[] ansList = new String[k];
  19. int i;
  20. for (i = 0; i < k; i++) {
  21. ansList[i] = strSet.get(i);
  22. }
  23. buildHeap(ansList);
  24. while (i < strSet.size()) {
  25. String heapMin = ansList[0];
  26. String str = strSet.get(i);
  27. if (compareTo(str, heapMin)) {
  28. ansList[0] = str;
  29. adjustHeap(ansList, 0);
  30. }
  31. i++;
  32. }
  33. String[][] ans = new String[k][2];
  34. for (int j = k - 1; j >= 0; j--) {
  35. ans[k - j - 1][0] = ansList[j];
  36. ans[k - j - 1][1] = map.get(ansList[j]) + "";
  37. }
  38. return ans;
  39. }
  40. private static void buildHeap(String[] ansList) {
  41. for (int i = ansList.length / 2 - 1; i >= 0; i--) {
  42. adjustHeap(ansList, i);
  43. }
  44. }
  45. private static void adjustHeap(String[] ansList, int currPos) {
  46. int len = ansList.length;
  47. String temp = ansList[currPos];
  48. for (int i = currPos * 2 + 1; i < len; i = i * 2 + 1) {
  49. if (i + 1 < len && compareTo(ansList[i], ansList[i + 1])) {
  50. i++;
  51. }
  52. if (compareTo(temp, ansList[i])) {
  53. ansList[currPos] = ansList[i];
  54. currPos = i;
  55. } else {
  56. break;
  57. }
  58. }
  59. ansList[currPos] = temp;
  60. }
  61. //比较,str1 > str2 返回 > 0
  62. private static boolean compareTo(String str1, String str2) {
  63. if (!map.get(str1).equals(map.get(str2))) {
  64. return map.get(str1) - map.get(str2) > 0;
  65. } else {
  66. return str1.compareTo(str2) < 0;
  67. }
  68. }
  69. }