You are given an integer array
- Pick any
nums[i] and delete it to earnnums[i] points. Afterwards, you must delete every element equal tonums[i] - 1 and every element equal tonums[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
Solution
當刪除了 nums[i],nums[i] - 1 和 nums[i] + 1 就不能使用
其實也就是,相鄰的值不能取,和 198. House Robber 是同樣的題目
那需要做些改變的是,必須是找相鄰的數字
那題目有說,數字是從 1 到 10000,所以用一個長度 10001 的 int array 來存
並把數字,以及相對應的分數給算起來
之後一樣用 DP 的概念去解就可以,max(從前一個來,從前兩個來 + 當前的值)
kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun deleteAndEarn(nums: IntArray): Int { | |
val sum = IntArray(10001) {0} | |
for(n in nums) { | |
sum[n] += n | |
} | |
for(i in 2..10000) { | |
sum[i] = Math.max(sum[i-1], sum[i-2] + sum[i]) | |
} | |
return sum.last() | |
} | |
} |
沒有留言:
張貼留言