-
Notifications
You must be signed in to change notification settings - Fork 0
/
Delete and Earn.java
68 lines (52 loc) · 2.02 KB
/
Delete and Earn.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
You are given an integer array nums. You want to maximize the number of points you get by performing the following operation any number of times:
Pick any nums[i] and delete it to earn nums[i] points. Afterwards, you must delete every element equal to nums[i] - 1 and every element equal to nums[i] + 1.
Return the maximum number of points you can earn by applying the above operation some number of times.
Example 1:
Input: nums = [3,4,2]
Output: 6
Explanation: You can perform the following operations:
- Delete 4 to earn 4 points. Consequently, 3 is also deleted. nums = [2].
- Delete 2 to earn 2 points. nums = [].
You earn a total of 6 points.
Example 2:
Input: nums = [2,2,3,3,3,4]
Output: 9
Explanation: You can perform the following operations:
- Delete a 3 to earn 3 points. All 2's and 4's are also deleted. nums = [3,3].
- Delete a 3 again to earn 3 points. nums = [3].
- Delete a 3 once more to earn 3 points. nums = [].
You earn a total of 9 points.
Constraints:
1 <= nums.length <= 2 * 104
1 <= nums[i] <= 104
*/
class Solution {
private HashMap<Integer, Integer> points = new HashMap<>();
private HashMap<Integer, Integer> cache = new HashMap<>();
private int maxPoints(int num) {
// Check for base cases
if (num == 0) {
return 0;
}
if (num == 1) {
return points.getOrDefault(1, 0);
}
if (cache.containsKey(num)) {
return cache.get(num);
}
// Apply recurrence relation
int gain = points.getOrDefault(num, 0);
cache.put(num, Math.max(maxPoints(num - 1), maxPoints(num - 2) + gain));
return cache.get(num);
}
public int deleteAndEarn(int[] nums) {
int maxNumber = 0;
// Precompute how many points we gain from taking an element
for (int num : nums) {
points.put(num, points.getOrDefault(num, 0) + num);
maxNumber = Math.max(maxNumber, num);
}
return maxPoints(maxNumber);
}
}