You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的Leetcode740 Delete and Earn动态规划解法存在什么问题?

代码存在的问题

1. 错误的边界条件判断

你额外新增的长度为2时直接返回nums[1]的逻辑完全不符合题目要求,比如输入[5,1],正确最大得分是5,但你的代码会直接返回1,这个边界判断多余且错误,直接删除即可。

2. 频率计数逻辑错误

makeDict函数里的计数代码存在运算符使用错误:

dict[num] = !!dict[num] ? dict[num]++ : 1

这里用了后置自增运算符++,后置自增会先返回变量原值再执行自增,所以赋值操作永远会把dict[num]设为原来的值,无法正确累加频率,可以修改为:

dict[num] = (dict[num] || 0) + 1

3. 状态变量赋值顺序和参考逻辑不匹配

你定义的keep对应Python代码里的using(选择当前数字的最大得分),avoid对应Python里的avoid(不选择当前数字的最大得分),但你赋值时的顺序和参考逻辑完全颠倒,导致状态更新错误。

4. 数字排序逻辑错误

Object.keys(freq).sort()默认是字典序排序,如果存在大于10的数字会出现排序错误,比如10会排在2前面,需要补充数字排序的比较函数。


修正后的完整可运行代码

const deleteAndEarn = (nums) => {
  if(!nums || nums.length === 0) return 0;
  if(nums.length === 1) return nums[0];
  
  const freq = makeDict(nums);
  let prevNum
  let [keep, avoid] = [0, 0];
  // 补充数字大小排序规则
  for(const num of [...Object.keys(freq)].sort((a,b) => a - b)){
    const curNum = parseInt(num)
    let max = Math.max(keep, avoid)
    if(curNum - 1 !== prevNum){
      // 对齐参考代码的赋值顺序
      [avoid, keep] = [
        max,
        curNum * freq[num] + max
      ]
    }else{
      [avoid, keep] = [
        max,
        curNum * freq[num] + avoid
      ]
    }
    prevNum = curNum
  }
  
  return Math.max(keep, avoid)
};

const makeDict = (nums) => {
  const dict = {}
  for(const num of nums){
    dict[num] = (dict[num] || 0) + 1
  }
  return dict
}

内容的提问来源于stack exchange,提问作者asdf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:04