740.删除并获得点数

69 阅读1分钟

**题目: **
给你一个整数数组 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
}