[路飞]_leetcode-692-前K个高频单词

161 阅读1分钟

题目描述

[题目地址]

给一非空的单词列表,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

示例 1:

输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i""love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i""love" 之前。

示例 2:

输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny""day" 是出现次数最多的四个单词,
    出现次数依次为 4, 3, 21 次。

注意:

  1. 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
  2. 输入的单词均由小写字母组成。

扩展练习:

  1. 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

分析

本文最简单直接的方式就是统计出现的单词及其出现的次数,然后将每一个元素按照出现次数从大到小排序,如果出现次数相同,则根据字母顺序排序

最后获取降序排序后的数组的前 k 个单词即可

代码如下:

var topKFrequent = function(words, k) {
  // 通过map记录出现过的单词及其出现次数
  const map = new Map();
  for(let i = 0;i<words.length;i++){
    const item = words[i];
    if(map.has(item)){
      map.set(item,map.get(item)+1)
    }else{
      map.set(item,1)
    }
  }
  // 将每一组单词及次数存入数组
  const arr = [];
  map.forEach((val,name) => {
    arr.push({name,val})
  })
  // 对数组排序
  arr.sort((a,b) => {
    if(a.val===b.val) return a.name<b.name?-1:1
    else return b.val-a.val
  })
  // 获取排序后的前k个单词
  const res = [];
  for(let i = 0;i<arr.length;i++){
    if(res.length<k) res.push(arr[i].name)
    else break;
  }
  return res;
};

至此我们就完成了leetcode-692-前K个高频单词