leetcode 740 删除并获得点数

简介: 【11月更文挑战第2天】给定一个整数数组 `nums`,每次可以选择删除一个元素并获得该元素的点数,同时该元素的左右相邻元素会变成相邻元素。目标是返回你能获得的最大点数。通过动态规划解决,统计每个数字的出现次数,设 `dp[i]` 表示以数字 `i` 结尾时能获得的最大点数。最终结果为 `dp` 数组中的最大值。时间复杂度为 O(n + m),空间复杂度为 O(m)。
  1. 问题描述
  • 给你一个整数数组 nums,你可以对它进行一些操作。每次操作中,你可以选择数组中的一个元素并删除它,同时获得该元素的点数。
  • 删除一个元素后,该元素的左右相邻元素会变成相邻元素。
  • 你需要返回你能获得的最大点数。
  1. 示例分析
  • 例如,给定数组 nums = [2, 2, 3, 3, 3, 4]
  • 如果选择删除数字 2,会获得 2*2 = 4 点(有两个 2)。然后数组变为 [3, 3, 3, 4]
  • 如果选择删除数字 3,会获得 3*3 = 9 点(有三个 3)。然后数组变为 [4]
  • 如果选择删除数字 4,会获得 4 点。
  • 最终,通过合理选择删除的数字,可以获得的最大点数为 4 + 9 + 4 = 17。
  1. 解题思路
  • 动态规划
  • 首先,统计数组中每个数字的出现次数。
  • 然后,考虑选择删除某个数字时,其相邻数字不能被选择删除。这就意味着我们需要在相邻数字的点数中做出权衡。
  • dp[i] 表示以数字 i 结尾时能获得的最大点数。如果数字 i 在数组中不存在,那么 dp[i] = 0
  • 对于数字i,如果它在数组中的出现次数为count,那么有两种情况:
  • 选择删除数字 i,此时获得的点数为 i * count,并且不能选择删除数字 i - 1i + 1,所以 dp[i] = i * count + dp[i - 2](因为不能选择 i - 1,所以考虑 dp[i - 2])。
  • 不选择删除数字 i,那么 dp[i] = dp[i - 1]
  • 最终的结果为 dp 数组中的最大值。
  1. 代码实现


def deleteAndEarn(nums):
    max_num = max(nums)
    freq = [0] * (max_num + 1)
    for num in nums:
        freq[num] += 1
    dp = [0] * (max_num + 1)
    dp[1] = freq[1]
    for i in range(2, max_num + 1):
        dp[i] = max(dp[i - 1], i * freq[i] + dp[i - 2])
    return dp[max_num]


  1. 复杂度分析
  • 时间复杂度:需要遍历数组两次,第一次统计每个数字的出现次数,第二次进行动态规划计算,时间复杂度为 ,其中 n 是数组 nums 的长度,m 是数组中的最大数字。
  • 空间复杂度:需要创建一个长度为 max_num + 1 的数组来存储动态规划的结果,空间复杂度为 ,其中 m 是数组中的最大数字。
目录
打赏
0
3
3
1
255
分享
相关文章
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
63 0
【LeetCode】1423. 可获得的最大点数
【LeetCode】1423. 可获得的最大点数
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
LeetCode(剑指 Offer)- 60. n个骰子的点数
LeetCode(剑指 Offer)- 60. n个骰子的点数
106 0
LeetCode(剑指 Offer)- 60. n个骰子的点数
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
7月前
|
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
84 6
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
172 2
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
127 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等