[LeetCode] Top K Frequent Elements

简介: Given a non-empty array of integers, return the k most frequent elements.For example, Given [1,1,1,2,2,3] and k = 2, return [1,2].Note: You may assume k is always valid, 1 ≤ k ≤ num

Given a non-empty array of integers, return the k most frequent elements.

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.

解题思路

  1. 用一个Map统计每个数字的出现频率。
  2. 依据出现频率对Map.Entry进行排序,排序算法为堆排序。
  3. 输出出现频率最高的k个元素。

实现代码

//Runtime: 43 ms
public class Solution {

    private void buildHeap(ArrayList<Map.Entry<Integer, Integer>> entries, int root, int len) {
        int left = 2 * root + 1;
        if (left < len) {
            int largest = left;
            int right = left + 1;
            if (right < len && entries.get(right).getValue() > entries.get(largest).getValue()) {
                largest = right;
            }
            if (entries.get(root).getValue() < entries.get(largest).getValue()) {
                Map.Entry<Integer, Integer> entry = entries.get(root);
                entries.set(root, entries.get(largest));
                entries.set(largest, entry);
                buildHeap(entries, largest, len);
            }
        }
    }

    private void heapSort(ArrayList<Map.Entry<Integer, Integer>> entries) {
        int len = entries.size();
        for (int i = len / 2; i >= 0; i--) {
            buildHeap(entries, i, len);
        }
        for (int i = len - 1; i > 0; i--) {
            Map.Entry<Integer, Integer> entry = entries.get(0);
            entries.set(0, entries.get(i));
            entries.set(i, entry);
            buildHeap(entries, 0, --len);
        }
    }

    public List<Integer> topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int num : nums) {
            if (map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }
        ArrayList<Map.Entry<Integer, Integer>> entries = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
        heapSort(entries);

        List<Integer> list = new ArrayList<Integer>(k);
        for (int i = entries.size() - 1; i >= entries.size() - k; i--) {
            list.add(entries.get(i).getKey());
        }
        return list;
    }
}
目录
相关文章
|
11月前
|
算法 安全 Swift
LeetCode - #56 合并区间(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
算法 安全 Swift
LeetCode - #53 最大子数组和(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
算法 安全 Swift
LeetCode - #49 字母异位词分组(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #48 旋转图像(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #48 旋转图像(Top 100)
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #46 全排列(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
算法 安全 Swift
LeetCode - #45 跳跃游戏 II(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
算法 安全 Swift
LeetCode - #42 接雨水(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #42 接雨水(Top 100)
|
1天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
1天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
11 0

热门文章

最新文章