两次堆排序+关联数组 我这个程序采用的是泛型,本来不是为了这道题而写,而是为了这一类题,使得不管输入的任何类型都可以计算前K个高频元素 因为要遵循题目格式,所以代码比较乱,之后会写成工具类放在github上, 欢迎大家star
class Solution { private static int size; private static <T extends Comparable> void build(List<T> t) { int pos = 1; size = t.size(); while ((2 * pos) <= t.size() || (2 * pos + 1) <= t.size()) { pos++; } pos--; while (pos != 0) { sink(t, pos); pos--; } } private static <T extends Comparable> void sink(List<T> t, int pos) { if (2 * pos > size) { return; } T left = t.get(2 * pos - 1); T min = left; int changeIndex = 2 * pos; T temp = t.get(pos - 1); if (2 * pos + 1 <= size) { T right = t.get(2 * pos); if (left.compareTo(right) > 0) { min = right; changeIndex++; } } if (temp.compareTo(min) > 0) { t.set(changeIndex - 1, temp); t.set(pos - 1, min); sink(t, changeIndex); } } public static <T extends Comparable> List<T> heapSort(List<T> t) { if (t.size() == 1) { return t; } build(t); return heapSortCore(t); } private static <T extends Comparable> List<T> heapSortCore(List<T> t) { int size_temp = size; List<T> temp = null; if (t instanceof ArrayList) { temp = new ArrayList<T>(size_temp); } if (t instanceof LinkedList) { temp = new LinkedList<T>(); } while (size_temp > 0) { temp.add(pop(t)); size_temp--; } return temp; } private static <T extends Comparable> T pop(List<T> t) { T first = t.get(0); t.set(0, t.get(size - 1)); T temp = t.remove(size - 1); size--; sink(t, 1); return first; } public int[] topKFrequent(int[] nums, int k) { Integer[] numInteger = new Integer[nums.length]; for (int i = 0; i < nums.length; i++) { numInteger[i] = new Integer(nums[i]); } List<Integer> lists = new ArrayList<>(Arrays.asList(numInteger)); lists = Solution.heapSort(lists); List<Node> result = new ArrayList<Node>(); Integer[] count = new Integer[lists.size()]; count[0] = 1; for (int i = 1; i < lists.size(); i++) { if (lists.get(i).equals(lists.get(i - 1))) { count[i] = count[i - 1] + 1; } else { count[i] = 1; } } List<Node> listNode = new ArrayList<>(); for (int i = count.length - 1; i >= 0; ) { listNode.add(new Node().setKeyAndValue(lists.get(i), count[i])); i = i - count[i]; } result = Solution.heapSort(listNode); Integer[] result_Node = (Integer[]) result.stream().limit(k).map(t -> t.getKey()).toArray(Integer[]::new); int[] resultReal = new int[result_Node.length]; for (int i = 0; i < resultReal.length; i++) { resultReal[i] = result_Node[i].intValue(); } return resultReal; } } class Node <K,V extends Comparable> implements Comparable<Node>{ private K key; private V value; public Node<K, V> setKeyAndValue(K key,V value){ this.key = key; this.value = value; return this; } @Override public int compareTo(Node o) { return -(this.value.compareTo(o.value)); } @Override public String toString(){ return key.toString()+ " "; } public K getKey(){ return key; } }