LeetCode 692 Javascript解决方案 Top K Frequent Words

本文深入解析了一种用于找出数组中出现频率最高的前K个单词的算法。通过详细阐述代码实现,包括单词排序、计数及归并排序等关键步骤,展示了如何高效地解决这一常见问题。同时,对比了不同排序方法的性能,指出在LeetCode环境中,直接使用sort方法可以显著提升执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

/**
 * @param {string[]} words
 * @param {number} k
 * @return {string[]}
 */
var topKFrequent = function(words, k) {
    words = words.sort();
    // words = words.sort((a, b) => a.localeCompare(b, {caseFirst: true}));
    let results = [];
    let counter = 0;
    let lastStr = null;
    let str;
    for(let i = 0; i < words.length; ++i){
        str = words[i];
        if(str !== lastStr){
            if(i !== 0){
                results.push({
                    str: lastStr,
                    counter
                });
            }
            counter = 1;
            lastStr = str;
        }
        else{
            counter++;
        }
    }
    results.push({
        str,
        counter
    });

    results = mergesort(results);
    // results.sort((a, b) => b.counter - a.counter); lc的引擎不是最新的
    return results.slice(0, k).reduce((list, el) => {
        list.push(el.str);
        return list;
    }, []);
    
    function bubbleSort(a) {
        var swapped;
        do {
            swapped = false;
            for (var i=0; i < a.length-1; i++) {
                if (a[i].counter < a[i+1].counter) {
                    var temp = a[i];
                    a[i] = a[i+1];
                    a[i+1] = temp;
                    swapped = true;
                }
            }
        } while (swapped);
    }
    
    function merge(leftArr, rightArr) {
      var sortedArr = [];
      while (leftArr.length && rightArr.length) {
        if (leftArr[0].counter >= rightArr[0].counter) {
          sortedArr.push(leftArr[0]);
          leftArr = leftArr.slice(1)
       } else {
          sortedArr.push(rightArr[0]);
          rightArr = rightArr.slice(1)
         }
       }
      while (leftArr.length)
        sortedArr.push(leftArr.shift());
      while (rightArr.length)
        sortedArr.push(rightArr.shift());
      return sortedArr;
    }
    function mergesort(arr) {
      if (arr.length < 2) {
        return arr; }
      else {
        var midpoint = parseInt(arr.length / 2);
        var leftArr   = arr.slice(0, midpoint);
        var rightArr  = arr.slice(midpoint, arr.length);
        return merge(mergesort(leftArr), mergesort(rightArr));
      }
    }
};
复制代码

注意项

对word进行排序

对word进行排序的时候,使用sort即可,比localCompare快非常非常多
用localCompare的时候,速度超过 0.7% 改直接用sort 速度超过91%

根据counter的排序算法

最新的v8引擎,排序已经使用稳定算法,故会更快,但是测试了下,lc的js引擎不是最新的,使用的sort算法不是稳定算法,故自行实现了 效率较高的稳定算法 归并排序。

运行图

转载于:https://juejin.im/post/5bd83947e51d452f7110d819

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值