**题目: **
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
算法:
先对nums排序,
func deleteAndEarn(nums []int) int {
maxVal := 0
for i := range nums {
if nums[i] > maxVal {
maxVal = nums[i]
}
}
sum := make([]int, maxVal + 1)
// 选择某一个数x时,获得分数为x * count(该数出现的次数)
// i为出现的数x,这里利用数组下标实现了对数x进行排序
for i := range nums {
sum[nums[i]] = sum[nums[i]] + nums[i]
}
return rob(sum)
}
// 等同于打家劫舍,选择了x则x-1,和x+1被删除意味着:不能打劫相邻的房子。
func rob(sum []int) int {
if len(sum) < 2 {
return sum[0]
}
// 只有一个数,选这个一个数作为得分,有两个数,选择这两个中较大的数作为得分
first, second := sum[0], max(sum[0], sum[1])
for i := 2; i < len(sum); i ++ {
// 当前得分要么选当前这个数,则前前个数被选了,则分数为first + sum[i]
// 要么不选当前这个数,则前一个数已经被选了,得分为second
first, second = second, max(first + sum[i], second)
}
return second
}
func max(a, b int) int {
if a > b {
return a
}
return b
}