30天刷题挑战(二十三)

题目来源: LeetCode 75 30 天 JavaScript 挑战

2694. 事件发射器

思路

模拟法,使用一个 Map 对象保存事件回调数组

代码

js 复制代码
class EventEmitter {
   #events = new Map()

    /**
     * @param {string} eventName
     * @param {Function} callback
     * @return {Object}
     */
	subscribe(eventName, callback) {
     if (!this.#events.has(eventName)) {
       this.#events.set(eventName, [])
     }

    this.#events.get(eventName).push(callback)
    
   return {
     unsubscribe: () => {
        const cbs = this.#events.get(eventName).filter(cb => cb !== callback)
        this.#events.set(eventName, cbs)
     }
   };
  }
    
    /**
     * @param {string} eventName
     * @param {Array} args
     * @return {Array}
     */
	emit(eventName, args = []) {
    return (this.#events.get(eventName) ?? []).map(cb => cb(...args))   
	}
}

1143. 最长公共子序列

思路

二维数组动态规划,当 text1[i - 1] 等于 text2[j - 1]dp[i][j] = dp[i - 1][j - 1] + 1,否则 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) 最后返回 dp 数组最大值

代码

js 复制代码
/**
 * @param {string} text1
 * @param {string} text2
 * @return {number}
 */
var longestCommonSubsequence = function(text1, text2) {
   const dp =  Array.from(Array(text1.length + 1), () => Array(text2.length + 1).fill(0))

   for (let i = 1; i <= text1.length; i++) {
     for (let j = 1; j <= text2.length; j++) {
       if (text1[i - 1] === text2[j - 1]) {
         dp[i][j] = dp[i - 1][j - 1] + 1
       } else {
         dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
       }
     }
   }

  return dp[text1.length][text2.length] 
};

714. 买卖股票的最佳时机含手续费

思路

动态规划,每天有两种情况,买股票或者卖股票,买股票要加上手续费,

代码

js 复制代码
/**
 * @param {number[]} prices
 * @param {number} fee
 * @return {number}
 */
var maxProfit = function(prices, fee) {
  if (!prices.length) {
    return 0
  }

  // 定义种情况
  let dp_0_0 = 0
  let dp_0_1 = -prices[0]

  for (let i = 1; i < prices.length; i++) {
    // 卖股票
    dp_0_0 = Math.max(dp_0_0, dp_0_1 + prices[i] - fee)
    // 买股票
    dp_0_1 = Math.max(dp_0_1, dp_0_0 - prices[i])
  }

  return dp_0_0
};

72. 编辑距离

思路

动态规划,dp[i][j] 表示 dp[i - 1][j - 1] 最少的操作数。每次遍历判断如果 word1[i - 1] 等于word2[j - 1] 那么 dp[i][j] = dp[i - 1][j - 1], 否则取 dp[i - 1][j] + 1, dp[i][j - 1] + 1 , dp[i - 1][j - 1] + 1 这三种操作的最小值。

代码

js 复制代码
/**
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var minDistance = function(word1, word2) {
  const dp = Array.from(Array(word1.length + 1), () => Array(word2.length + 1).fill(0))

  for(let i = 1; i <= word1.length; i++) {
    dp[i][0] = i
  }

  for(let i = 1; i <= word2.length; i++) {
    dp[0][i] = i
  }

  for(let i = 1; i <= word1.length; i++) {
      for(let j = 1; j <= word2.length; j++) {
          if(word1[i - 1] === word2[j - 1]) {
              dp[i][j] = dp[i - 1][j - 1]
          } else {
              dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1)
          }
      }
  }
  
  return dp[word1.length][word2.length]
};

本文完,感谢阅读。

相关推荐
码海扬帆:前端探索之旅4 小时前
深度定制 uni-combox:新增功能详解与实战指南
前端·vue.js·uni-app
谷雨不太卷4 小时前
进程的状态码
java·前端·算法
打小就很皮...4 小时前
基于 Python + LangChain + RAG 的知识检索系统实战
前端·langchain·embedding·rag
BJ-Giser4 小时前
Cesium 烟雾粒子特效
前端·可视化·cesium
空中海4 小时前
02 ArkTS 语言与工程规范
java·前端·spring
YJlio4 小时前
7.4.5 Windows 11 企业网络连接与网络重置实战:远程访问、本地策略与故障恢复
前端·chrome·windows·python·edge·机器人·django
散峰而望4 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
躺不平的理查德4 小时前
时间复杂度与空间复杂度备忘录
数据结构·算法
yaki_ya4 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦4 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode