740 删除并获得点数

题目:

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

分析:

进阶版的打家劫舍。

先统计数组中每个元素出现的总点数,然后再做打家劫舍。

// date 2023/11/11
func deleteAndEarn(nums []int) int {
    maxVal := 0
    for _, v := range nums {
        maxVal = max(maxVal, v)
    }
    sum := make([]int, maxVal+1)
    for _, v := range nums {
        sum[v] += v
    }

    // 对 sum 打家劫舍
    if len(sum) == 1 {
        return sum[0]
    }
    if len(sum) == 2 {
        return max(sum[0], sum[1])
    }
    f1, f2 := sum[0], sum[1]
    f := 0
    for i := 2; i < len(sum); i++ {
        f = max(f2, f1 + sum[i])
        f1, f2 = f2, f
    }
    return f
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

最后更新于