740. Delete and Earn

网友投稿 256 2022-09-17

740. Delete and Earn

Given an array nums of integers, you can perform operations on the array.

In each operation, you pick any nums[i] and delete it to earn nums[i] points. After, you must delete every element equal to nums[i] - 1 or nums[i] + 1.

You start with 0 points. Return the maximum number of points you can earn by applying such operations.

Example 1:

Input: nums = [3, 4, 2]Output: 6Explanation: Delete 4 to earn 4 points, consequently 3 is also deleted.Then, delete 2 to earn 2 points. 6 total points are

Example 2:

Input: nums = [2, 2, 3, 3, 3, 4]Output: 9Explanation: Delete 3 to earn 3 points, deleting both 2's and the 4.Then, delete 3 again to earn 3 points, and 3 again to earn 3 points.9

Note:

The length of nums is at most 20000. Each element nums[i] is an integer in the range [1, 10000].

Intuition

Because all numbers are positive, if we “take” a number (use it to score points), we might as well take all copies of it, since we’ve already erased all its neighbors. We could keep a count of each number so we know how many points taking a number is worth total.

Now let’s investigate what happens when we add a new number X (plus copies) that is larger than all previous numbers. Naively, our answer would be the previous answer, plus the value of X - which can be solved with dynamic programming. However, this fails if our previous answer had a number taken that was adjacent to X.

Luckily, we can remedy this. Let’s say we knew using, the value of our previous answer, and avoid, the value of our previous answer that doesn’t use the previously largest value prev. Then we could compute new values of using and avoid appropriately.

Algorithm

For each unique value k of nums in increasing order, let’s maintain the correct values of avoid and using, which represent the answer if we don’t take or take k respectively.

If the new value k is adjacent to the previously largest value prev, then the answer if we must take k is (the point value of k) + avoid, while the answer if we must not take k is max(avoid, using). Similarly, if k is not adjacent to prev, the answer if we must take k is (the point value of k) + max(avoid, using), and the answer if we must not take k is max(avoid, using).

At the end, the best answer may or may not use the largest value in nums, so we return max(avoid, using).

Our demonstrated solutions showcase two different kinds of sorts: a library one, and a radix sort. For each language, the other kind of solution can be done without much difficulty, by using an array (Python) or HashMap (Java) respectively.

class Solution { 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); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:713. Subarray Product Less Than K
下一篇:756. Pyramid Transition Matrix
相关文章

 发表评论

暂时没有评论,来抢沙发吧~