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
class Solution {
public int deleteAndEarn(int[] nums) {
Map<Integer, Integer> numPointMap = new HashMap<>();
for (int num : nums) {
numPointMap.put(num, numPointMap.getOrDefault(num, 0) + num);
}
List<Map.Entry<Integer, Integer>> numPointPairList = new ArrayList<>(numPointMap.entrySet());
Collections.sort(numPointPairList, (a, b) -> Integer.compare(a.getKey(), b.getKey()));
int first = 0, second = numPointPairList.get(0).getValue();
for (int i = 1; i < numPointPairList.size(); i++) {
int currNum = numPointPairList.get(i).getKey(), currValue = numPointPairList.get(i).getValue();
int lastNum = numPointPairList.get(i - 1).getKey();
if (currNum - 1 != lastNum) {
int currMax = currValue + second;
first = second;
second = currMax;
} else {
int currMax = Math.max(currValue + first, second);
first = second;
second = currMax;
}
}
return second;
}
}

House Robber的变体. 我们先把取每个num能得到的score存到一个map中. 比如[2, 3, 3, 3, 4]. 取2的话能得到2, 取3的话能得到9(尽管消除了2和4). 取4得到4. 这里存的只是取某个数字取尽后得到的score. 然后我们根据num大小sort一下. 这样就变成了House Robber. 如果两个num相邻, 那么其实就是house robber, 如果不相邻, 那么直接连着取.

时间复杂度: O(n + klogk) k是distinct num的个数.
空间复杂度: O(k + logk) -> O(k) 因为用map存数据, list存数据, 排序.