翼度科技»论坛 编程开发 JavaScript 查看内容

leetcode 740 删除并获得点数

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
740 删除并获得点数

题意

给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums ,删除它并获得 nums 的点数。之后,你必须删除 所有 等于 nums - 1 和 nums + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
案例

示例 1:
  1. 输入:nums = [3,4,2]
  2. 输出:6
  3. 解释:
  4. 删除 4 获得 4 个点数,因此 3 也被删除。
  5. 之后,删除 2 获得 2 个点数。总共获得 6 个点数。
复制代码
示例 2:
  1. 输入:nums = [2,2,3,3,3,4]
  2. 输出:9
  3. 解释:
  4. 删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
  5. 之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
  6. 总共获得 9 个点数。
复制代码
思路


  • 当我们操作完nums的元素之后,必须要删除nums - 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
删除第二个元素可以获得的数就是
判断第二个元素和第一个元素是否相邻的,如果是相邻的就从两个取一个最大值。如果不是就直接相加
依次排列。。。
由此我们的出的公式就是
不是相邻的
$$
s_i = a_map[nums_i] + s{i-1}
$$
相邻的
$$
s_i = max(a_map[nums_{i-2}] + nums_i, nums_{i - 1})
$$
代码
  1. const deleteAndEarn = (nums: number[]): number => {
  2.     const map: { [key: number]: number } = nums.reduce((a: { [key: number]: number }, b: number): {
  3.         [key: number]: number
  4.     } => {
  5.         const value = a[b] || 0;
  6.         a[b] = value + 1
  7.         return a
  8.     }, {})
  9.     const keys = Object.keys(map)
  10.         .sort((a, b) => parseInt(a) - parseInt(b))
  11.         .map(item => parseInt(item));
  12.     const dp = new Array(nums.length).fill(0);
  13.     // 边界情况
  14.     if (nums.length === 0) return 0;
  15.     else if (keys.length === 1) return map[keys[0]] * keys[0]
  16.     // 给dp数组默认值
  17.     dp[0] = keys[0] * map[keys[0]]
  18.     // 开始写遍历
  19.     console.log(keys)
  20.     for (let i = 1; i < keys.length; i++) {
  21.         // 判断是不是属于i-1或者i+1的情况
  22.         if (keys[i] - 1 !== keys[i - 1]) {
  23.             dp[i] = keys[i] * map[keys[i]] + dp[i - 1];
  24.         } else {
  25.             // 这里是属于i-1或者i+1的情况
  26.             // 注意,需要注意一下当i是1时候我们要进行i-2,会有问题,所以我门这里也要单独判断一下。
  27.             let last_value: number
  28.             if (i === 1) {
  29.                 last_value = 0;
  30.             } else {
  31.                 last_value = dp[i - 2];
  32.             }
  33.             dp[i] = Math.max(last_value + keys[i] * map[keys[i]], dp[i - 1]);
  34.         }
  35.     }
  36.     return dp[keys.length - 1];
  37. }
复制代码
结语
如果对您有帮助的话,您可以搜搜一下正在努力的迪迦关注一下此公众号吗?谢谢您了。

来源:https://www.cnblogs.com/dijia-blog1/p/18520852
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具