欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 力扣 中等 740.删除并获得点数

力扣 中等 740.删除并获得点数

2024/10/28 6:14:56 来源:https://blog.csdn.net/qq_51352130/article/details/143269036  浏览:    关键词:力扣 中等 740.删除并获得点数

文章目录

  • 题目介绍
  • 题解

题目介绍

在这里插入图片描述
在这里插入图片描述

题解

由题意可知,在选择了数组中元素 a 后,该元素以及所有等于 a−1 和 a+1 的元素都会从数组中删去,并获得 a 的点数。若还有多个值为 a的元素,由于所有等于 a−1 或 a+1 的元素已经被删除,我们可以直接删除 a并获得其点数。因此若选择了 a,所有等于 a 的元素也应一同被选择,才可以尽可能多地获得点数。

记元素 a 在数组中出现的次数为 Ca ,我们可以用一个数组 sum 记录数组 nums 中所有相同元素之和,即 sum[a]=x⋅Ca 。若选择了 a,则可以获取 sum[a] 点数,且无法再选择 a−1 和 a+1。例如示例二 :其sum数组为[0,0,4,9,4] ,不可以选择数组相邻的两个数,这就转换成了198. 打家劫舍 链接 。在统计出 sum 数组后,可以直接用打家劫舍的代码求得最大点数。

代码如下:

class Solution {public int deleteAndEarn(int[] nums) {int maxVal = 0;for (int val : nums) {maxVal = Math.max(maxVal, val);}int[] sum = new int[maxVal + 1];for (int val : nums) {sum[val] += val;}return rob(sum);}public int rob(int[] nums) {int n = nums.length;if(n == 1){return nums[0];}if(n == 2){return Math.max(nums[0], nums[1]);}int[] dp = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0], nums[1]);for(int i = 2; i < n; i++){dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);}return dp[n - 1];}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com