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 是数组中的最大数字。
相关文章
|
11月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
76 0
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
【LeetCode】149. 直线上最多的点数
【LeetCode】149. 直线上最多的点数
【LeetCode】149. 直线上最多的点数
|
Java C++
LeetCode(剑指 Offer)- 60. n个骰子的点数
LeetCode(剑指 Offer)- 60. n个骰子的点数
115 0
LeetCode(剑指 Offer)- 60. n个骰子的点数
|
10月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
138 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
11月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
111 6
|
11月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
229 2
|
10月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
134 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

热门文章

最新文章