【发布时间】:2018-08-24 17:36:42
【问题描述】:
我正在经历这个leetcode algorithm,我试图通过阅读解释来理解它,因为两天以来我多次阅读,但我无法理解程序是如何解决的。
这是问题陈述:
给定一个整数数组 nums,你可以对 数组。
在每个操作中,您选择任何 nums[i] 并删除它以获得 nums[i] 点。之后,您必须删除每个等于 nums[i] - 1 的元素或 nums[i] + 1.
你从 0 分开始。返回你可以得到的最大点数 通过应用此类操作赚取收益。
示例 1:输入:nums = [3, 4, 2] 输出:6 解释:删除 4 到 获得 4 分,因此 3 也被删除。然后,删除2赚取 2分。共获得 6 分。
解决方法如下:
算法
对于 nums 中的每个唯一值 k 按递增顺序,让我们维护 避免和使用的正确值,代表答案如果 我们不分别取或取 k。
如果新值 k 与之前的最大值 prev 相邻, 那么我们必须取k的答案是(k的点值)+避免, 而如果我们不能取 k,答案是 max(avoid, using)。 类似地,如果 k 与 prev 不相邻,则答案如果我们必须取 k 是 (k 的点值) + max(avoid, using),如果我们得到答案 不能取 k 为最大值(避免,使用)。
最后,最佳答案可能会或可能不会使用中的最大值 nums,所以我们返回 max(avoid, using)。
以及对应的Java程序:
public int deleteAndEarn(int[] nums) {
int[] count = new int[10001];
for (int x: nums) count[x]++;
int avoid = 0, using = 0, prev = -1;
for (int k = 0; k <= 10000; ++k) if (count[k] > 0) {
int m = Math.max(avoid, using);
if (k - 1 != prev) {
using = k * count[k] + m;
avoid = m;
} else {
using = k * count[k] + avoid;
avoid = m;
}
prev = k;
}
return Math.max(avoid, using);
}
我无法理解这里如何使用 avoid 和 using 变量以及它如何解决问题陈述。
你能帮我理解一下吗?
【问题讨论】:
-
你有没有用调试器单步调试代码来观察“目标函数”是如何工作的?
-
你不明白它是如何解决的或者代码是如何对应的吗?
-
@Micromuncher,是的,尝试使用 Eclipse IDE 进行调试
-
@juvian,我根据解释理解了代码。但我无法理解解释。