LeetCode 740. 删除与获得点数(排序+动态规划)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给定一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i]
,删除它并获得 nums[i]
的点数。之后,你必须删除每个等于 nums[i] - 1
或 nums[i] + 1
的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
示例 1:
输入: nums = [3, 4, 2]
输出: 6
解释:
删除 4 来获得 4 个点数,因此 3 也被删除。
之后,删除 2 来获得 2 个点数。总共获得 6 个点数。示例 2:
输入: nums = [2, 2, 3, 3, 3, 4]
输出: 9
解释:
删除 3 来获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。注意:
nums的长度最大为20000。
每个整数nums[i]的大小都在[1, 10000]范围内。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-and-earn
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 先预处理出每个数字的分数,并且按数字排序,使用map
dp[i][0]
表示不拿,dp[i][1]
表示拿i
号数字时的最大得分
class Solution {public:int deleteAndEarn(vector<int>& nums) {if(nums.empty())return 0;map<int,int> num_points;for(int num : nums)num_points[num] += num;//数字和其对应的分数vector<pair<int,int>> num_pts(num_points.begin(), num_points.end());//map key有序vector<vector<int>> dp(num_points.size(), vector<int>(2, 0));// dp[i][0] 表示不拿, dp[i][1] 表示拿 i 号数字的最大得分dp[0][1] = num_pts[0].second;//拿第一个数的得分for(int i = 1; i < num_pts.size(); ++i){if(num_pts[i-1].first+1 < num_pts[i].first)//数字间隔大于1dp[i][1] = num_pts[i].second + max(dp[i-1][0], dp[i-1][1]);//前一个数可以拿或者不拿else // num_pts[i-1].first+1 == num_pts[i].first 间隔1//我要拿了,前一个不能拿dp[i][1] = num_pts[i].second + dp[i-1][0];dp[i][0] = max(dp[i-1][0], dp[i-1][1]); //我不拿,那么前一个拿或者不拿}return max(dp.back()[0], dp.back()[1]);}
};
20 ms 10.4 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 740. 删除与获得点数(排序+动态规划)相关推荐
- leetcode - 740. 删除与获得点数
740. 删除与获得点数 -------------------------------------------- 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 n ...
- [leetcode] 740.删除并获得点数
给你一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 所有 等于 nums[i] - 1 和 nu ...
- leetcode 740. 删除并获得点数(dp)
给你一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除每个等于 nums[i] - 1 或 nums ...
- 【LeetCode】LeetCode之删除并获得点数——动态规划、排序+动态规划
- leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP)
题目 https://leetcode.com/problems/delete-and-earn/ 题解 建立 help 数组,相当于一个(正向)索引表. 先排序,因为删除的顺序不影响最优结果(实际上 ...
- 动态规划——删除并获得点数(Leetcode 740)
题目选自Leetcode 740. 删除并获得点数 这道题和打家劫舍其实很类似,只不过因为这道题给的原始数组其实对于元素的值和位置来说并不是连续的,所以我们可以将其转化为统计出每个数字的值,然后进行& ...
- C++描述 LeetCode 26. 删除排序数组中的重复项
C++描述 LeetCode 26. 删除排序数组中的重复项 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客 ...
- LeetCode 552. 学生出勤记录 II(动态规划)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 10^9 + 7的值. 学生出勤记录是只 ...
- LeetCode 576. 出界的路径数(动态规划)
文章目录 1. 题目 2. 解题 1. 题目 给定一个 m × n 的网格和一个球. 球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界. ...
最新文章
- 揭秘三维视觉之结构光原理
- mysql 5.7.28 windows_Windows下mysql-5.7.28下载、安装、配置教程
- 动态生成一个继承接口的类
- Cookie, LocalStorage 与 SessionStorage异同
- 什么是WebSocket,它与HTTP有何不同?
- matlab圆形器件,计算围绕点+ Matlab的圆形箱
- Explorer.exe报错故障解决一例
- lib-flexible vue项目(移动端适配)
- 如何获取Class类对象?
- 用Python正则实现词频统计并验证Zipf-Law
- JavaScript——onblur事件失效问题解决方案
- IE11浏览器缓存bug
- 数据可视化的方法、工具和应用
- 高绩效团队-VUCA时代的五个管理策略《二》—代际管理
- IDEA代码放大缩小快捷键设置、注释、标识符以及关键字。
- 什么是深度学习? 模仿人脑的算法
- 北京有哪些牛逼的中小型公司?
- 中国半导体企业百强榜(TOP 100)
- Java数字转换为人民币的大写
- 计算机内存智能清理系统好些,电脑内存怎么清理?