问题描述 给你一个整数数组 nums 和一个整数 k,请你返回其中出现频率前 k 高的元素。请按升序排列。 1 <= nums.length <= 10^5

54 阅读1分钟

根据问题描述,我们无法使用暴力的方法进行求解,要求时间<nlogn也就是快排的时间复杂度 因此我们考虑使用hash和堆来维护前k高的元素,再根据hash中的key来进行快排总共时间复杂度为O(n+klogk)

    Map<Integer, Integer> countMap = new HashMap<>();
    for (int num : nums) {
        countMap.put(num, countMap.getOrDefault(num, 0) + 1);
    }

    // 创建一个最小堆,根据出现次数排序
    PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
            (entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())
    );

    // 将所有元素添加到堆中
    for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
        minHeap.offer(entry);
      
    }

    int []sort=new int[k];

    for(int i=0;i<k;i++){
        sort[i]=minHeap.poll().getKey();
    }

    Arrays.sort(sort);
    // 构建结果字符串
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<k;i++){
        sb.append(sort[i]);
        if (i<k-1) {
            sb.append(","); // 如果不是最后一个元素,则添加逗号
        }
    } 

return sb.toString();

ac代码如上