leetcode 740 删除并获得点数
740 删除并获得点数
题意
给你一个整数数组 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[i]的元素之后,必须要删除nums[i] - 1和nums[i+1]的所有元素,所以我们需要对数组做一个排序,这样nums[i+1]和nums[i-1]就是两个相连在一起的数据了。
- 他又需要获取操作操作的最大点数,所以我们需要对这些数做一个汇总。
- 然后就可以遍历处理之后的数组了。举个例子,我们处理完的数据是a_map = {1:3,4:10, 2:12,3: 13}。后面用a_map来表示这个映射,,key表示原始数据,value表示汇总之后的数据。
- 我们就可以获取到key之后,对他进行排序并遍历。(1,2,4】
开始判断要不删除当前元素
【1, 2, 3, 5】
当删除第一个元素可以获得数就是a_map[i]
删除第二个元素可以获得的数就是
判断第二个元素和第一个元素是否相邻的,如果是相邻的就从两个取一个最大值。如果不是就直接相加
依次排列。。。
由此我们的出的公式就是
不是相邻的
$$
s_i = a_map[nums_i] + s{i-1}
$$
相邻的
$$
s_i = max(a_map[nums_{i-2}] + nums_i, nums_{i - 1})
$$
代码
const deleteAndEarn = (nums: number[]): number => {
const map: { [key: number]: number } = nums.reduce((a: { [key: number]: number }, b: number): {
[key: number]: number
} => {
const value = a[b] || 0;
a[b] = value + 1
return a
}, {})
const keys = Object.keys(map)
.sort((a, b) => parseInt(a) - parseInt(b))
.map(item => parseInt(item));
const dp = new Array(nums.length).fill(0);
// 边界情况
if (nums.length === 0) return 0;
else if (keys.length === 1) return map[keys[0]] * keys[0]
// 给dp数组默认值
dp[0] = keys[0] * map[keys[0]]
// 开始写遍历
console.log(keys)
for (let i = 1; i < keys.length; i++) {
// 判断是不是属于i-1或者i+1的情况
if (keys[i] - 1 !== keys[i - 1]) {
dp[i] = keys[i] * map[keys[i]] + dp[i - 1];
} else {
// 这里是属于i-1或者i+1的情况
// 注意,需要注意一下当i是1时候我们要进行i-2,会有问题,所以我门这里也要单独判断一下。
let last_value: number
if (i === 1) {
last_value = 0;
} else {
last_value = dp[i - 2];
}
dp[i] = Math.max(last_value + keys[i] * map[keys[i]], dp[i - 1]);
}
}
return dp[keys.length - 1];
}
结语
如果对您有帮助的话,您可以搜搜一下正在努力的迪迦关注一下此公众号吗?谢谢您了。
leetcode 740 删除并获得点数的更多相关文章
- Java实现 LeetCode 740 删除与获得点数(递推 || 动态规划?打家劫舍Ⅳ)
740. 删除与获得点数 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除每个等于 nums[ ...
- LeetCode 80. 删除排序数组中的重复项 II
LeetCode 80. 删除排序数组中的重复项 II
- LeetCode:删除排序链表中的重复元素【83】
LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...
- LeetCode:删除链表中的节点【203】
LeetCode:删除链表中的节点[203] 题目描述 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val ...
- 前端与算法 leetcode 26. 删除排序数组中的重复项
目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- [Swift]LeetCode740. 删除与获得点数 | Delete and Earn
Given an array nums of integers, you can perform operations on the array. In each operation, you pic ...
- 领扣(LeetCode)删除排序数组中的重复项 个人题解
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...
- LeetCode 1021. 删除最外层的括号(Remove Outermost Parentheses)
1021. 删除最外层的括号 1021. Remove Outermost Parentheses 题目描述 有效括号字符串为空 ("")."(" + A + ...
- LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
1047. 删除字符串中的所有相邻重复项 1047. Remove All Adjacent Duplicates In String 题目描述 LeetCode1047. Remove All Ad ...
随机推荐
- AtCoder Beginner Contest 329 F
AtCoder Beginner Contest 329F F - Colored Ball (atcoder.jp)(启发式合并) 问题陈述 有 \(N\) 个编号为 \(1, 2, \ldots, ...
- Camera | 11.瑞芯微摄像头采集图像颜色偏绿解决笔记
前言 在实际调试基于瑞芯微平台的camera过程中,发现显示的图片发绿, 现在把调试步骤分享给大家: 1.修改iq文件 sdk中位置: @external/camera_engine_rkaiq/iq ...
- Python 开发中,使用bcrypt 或 Passlib 对系统用户密码进行哈希和验证处理
在设计一个系统的时候,肯定都有会有用户身份认证的问题,一般对用户校验的时候,都是对用户存在数据库总的密码哈希值进行判断,从而避免密码泄露和反向解密,那么在Python 开发中,我们可以引入bcrypt ...
- 搭建QT开发环境
下载 Qt官网,Qt下载网址 安装前要登录账号,其他的该咋就咋样,路径不能有中文. 组件自己选 我的是MinGW.Android.虚拟键盘.Qt脚本.Qt Creator 然后创个项目,能跑起来就是安 ...
- 充分利用HarmonyOS NEXT:开发者的全功能指南
随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战.在当今的科技浪潮中,如何抓住创新的机遇?HarmonyOS NEXT的发布,带来了全新的机遇和功能.本文将探讨开发者如何充 ...
- Win11减少C盘占用及清爽系统配置教程
Win11减少C盘占用及清爽系统配置教程 你是否有过C盘爆满而不得不重装系统的经历?你是否有过因为C盘爆满而不得不不断的拓展空间的无奈?你是否有过已经将软件安装在D盘但C盘的空间还是在日益变满的痛苦? ...
- DataV兼容vue3的方法
发现问题 在使用vue开发大屏时,发现了一个很好用的可视化组件库DataV,不是阿里那个DataV哈,用vue2开发时都一切顺利,直到有一天升级项目到vue3时,发现一堆报错,后面查了下,好像是Dat ...
- Angular 18+ 高级教程 – Naming Conversion
前言 命名规范对项目维护是很重要的. Angular 对项目的渗透很大的, 必须做好命名规范, 不然会很乱. InjectionToken InjectionToken = UPPER_SNAKE_C ...
- CSS & JS Effect – Dialog Modal
效果 参考: Youtube – Create a Simple Popup Modal Youtube – Create a Modal (Popup) with HTML/CSS and Java ...
- CSS & JS Effect – fade in
参考: stackoverflow – Is there a CSS-only (pure CSS) workaround to apply fade-in and fade-out on objec ...