LeetCode_前K个高频元素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/88789011

问题描述:

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。

思路:在给定的非空数组中如果是考虑到了返回频率前k高的元素,而且要求了时间复杂度必须优于O(nlogn)

在使用了 treemap对数组元素进行遍历统计之后可以通过对treemap的value进行统计排序

import java.util.TreeMap;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.Comparator;
import java.util.Map;
class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        //使用TreeMap可以对value进行排序的思想
         HashMap<Integer, Integer> map = new HashMap<>();
        ValueComparator bvc =  new ValueComparator(map);
        TreeMap<Integer, Integer> sorted_map = new TreeMap<>(bvc);
        for(int num:nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num,1);
            }
        }
        //将map直接放入到treemap中
         sorted_map.putAll(map);
         LinkedList<Integer> res =new LinkedList<>();
        Iterator iter = sorted_map.entrySet().iterator();
        while(iter.hasNext()){
          Map.Entry entry = (Map.Entry)iter.next();
            if(res.size()<k){
                //直接通过entry.getKey()获取到的为object对象,需要转换类型为integer类型
                res.add((Integer)entry.getKey());
            }else{
                break;
            }
        } 
        return res;
    }
}
class ValueComparator implements Comparator<Integer> {
    Map<Integer, Integer> base;
    //这里需要将要比较的map集合传进来
    public ValueComparator(Map<Integer, Integer> base) {
        this.base = base;
    }
    // Note: this comparator imposes orderings that are inconsistent with equals.
    //比较的时候,传入的两个参数应该是map的两个key,根据上面传入的要比较的集合base,
    //可以获取到key对应的value,然后按照value进行比较
    public int compare(Integer a, Integer b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/88789011