我的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
相关产品推荐
相关产品推荐

