347. 前 K 个高频元素

求元素次数,想到用 map 计录。
前 k 个高频元素:排序。
map 无法对值排序,可更换 map 键值位置,或把map 转化为list 来实现。

 class Solution {
        public int[] topKFrequent(int[] nums, int k) {
            Map<Integer,Integer> map = new HashMap();
            //记录次数
            for(int i : nums){
                if(map.containsKey(i)){
                    map.put(i,map.get(i)+1);
                }else{
                    map.put(i,1);
                }
            }

			//排序
            List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
            Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>() {
                public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                    return o2.getValue()-o1.getValue();
                }
            });
            int i =0;
            nums = new int[k];
            for (Map.Entry<Integer, Integer> e: list) {
                nums[i++]=e.getKey();
                if(i>=k){
                    break;
                }
            }
            return nums;
        }
    }

知识点:
map 无法直接对值排序,需要转化为list,使用 Collections.sort 排序。
排序的时候要么大于,要么小于,要么等于,不能存在歧义,无法判定大小的情况。
o1>o2 是升序。

其他答案:

最恰当的数据结构:优先级队列。(堆,完全二叉树),可以实现对数据进行排序。

PriorityQueue<Map.Entry<Integer,Integer>> queue =
new PriorityQueue<>((o1,o2)-> o1.getValue-o2.getValue);

知识点:
优先级队列使用
重写排序方法
offer == set
poll == get 并删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值