zoukankan      html  css  js  c++  java
  • 692. Top K Frequent Words

    package LeetCode_692
    
    import java.util.*
    import kotlin.collections.ArrayList
    import kotlin.collections.HashMap
    
    /**
     * 692. Top K Frequent Words
     * https://leetcode.com/problems/top-k-frequent-words/description/
     *
     * Given a non-empty list of words, return the k most frequent elements.
    Your answer should be sorted by frequency from highest to lowest.
    If two words have the same frequency, then the word with the lower alphabetical order comes first.
    
    Example 1:
    Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
    Output: ["i", "love"]
    Explanation: "i" and "love" are the two most frequent words.
    Note that "i" comes before "love" due to a lower alphabetical order.
    
    Example 2:
    Input: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
    Output: ["the", "is", "sunny", "day"]
    Explanation: "the", "is", "sunny" and "day" are the four most frequent words,
    with the number of occurrence being 4, 3, 2 and 1 respectively.
    
    Note:
    You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
    Input words contain only lowercase letters.
    
    Follow up:
    Try to solve it in O(n log k) time and O(n) extra space.
     * */
    class Solution {
        /*
        * solution 1: HashMap+PriorityQueue, Time complexity:O(nlogk), Space complexity:O(n)
        * */
        fun topKFrequent(words: Array<String>, k: Int): List<String> {
            val map = HashMap<String, Int>()
            for (word in words) {
                map.put(word, map.getOrDefault(word, 0) + 1)
            }
            val queue = PriorityQueue<Pair<String, Int>> { a, b ->
                if (a.second == b.second) {
                    //if frequency is same, take the alphabetical desc, because the result need reverse it
                    b.first.compareTo(a.first)
                } else {
                    //take the frequency asc, because the result need reverse it also
                    a.second - b.second
                }
            }
            for (item in map) {
                queue.offer(Pair(item.key, item.value))
                if (queue.size > k) {
                    queue.remove()
                }
            }
            val result = ArrayList<String>()
            while (queue.isNotEmpty()) {
                result.add(0, queue.poll().first)
            }
            return result
        }
    }
  • 相关阅读:
    asp.net中页面传值的几种经典方法
    关于ASp.NEt方面的好书,不得不看啊!!!
    Qt Creator 窗体控件自适应窗口大小布局
    自己动手打造T9510E EMUIB502新功能
    OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
    Qt 中获取本机IP地址
    嵌入式Linux中GPS信息读取与处理
    OpenCV 学习资源整理
    新Outlook邮箱的客户端设置
    Qt 中显示中文
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13252523.html
Copyright © 2011-2022 走看看