返回介绍

solution / 0700-0799 / 0740.Delete and Earn / README

发布于 2024-06-17 01:03:34 字数 3238 浏览 0 评论 0 收藏 0

740. 删除并获得点数

English Version

题目描述

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

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

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

 

示例 1:

输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。

示例 2:

输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

 

提示:

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] <= 104

解法

方法一

class Solution:
  def deleteAndEarn(self, nums: List[int]) -> int:
    mx = -inf
    for num in nums:
      mx = max(mx, num)
    total = [0] * (mx + 1)
    for num in nums:
      total[num] += num
    first = total[0]
    second = max(total[0], total[1])
    for i in range(2, mx + 1):
      cur = max(first + total[i], second)
      first = second
      second = cur
    return second
class Solution {
  public int deleteAndEarn(int[] nums) {
    if (nums.length == 0) {
      return 0;
    }

    int[] sums = new int[10010];
    int[] select = new int[10010];
    int[] nonSelect = new int[10010];

    int maxV = 0;
    for (int x : nums) {
      sums[x] += x;
      maxV = Math.max(maxV, x);
    }

    for (int i = 1; i <= maxV; i++) {
      select[i] = nonSelect[i - 1] + sums[i];
      nonSelect[i] = Math.max(select[i - 1], nonSelect[i - 1]);
    }
    return Math.max(select[maxV], nonSelect[maxV]);
  }
}
class Solution {
public:
  int deleteAndEarn(vector<int>& nums) {
    vector<int> vals(10010);
    for (int& num : nums) {
      vals[num] += num;
    }
    return rob(vals);
  }

  int rob(vector<int>& nums) {
    int a = 0, b = nums[0];
    for (int i = 1; i < nums.size(); ++i) {
      int c = max(nums[i] + a, b);
      a = b;
      b = c;
    }
    return b;
  }
};
func deleteAndEarn(nums []int) int {

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

  mx := math.MinInt32
  for _, num := range nums {
    mx = max(mx, num)
  }
  total := make([]int, mx+1)
  for _, num := range nums {
    total[num] += num
  }
  first := total[0]
  second := max(total[0], total[1])
  for i := 2; i <= mx; i++ {
    cur := max(first+total[i], second)
    first = second
    second = cur
  }
  return second
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文