力扣740. 删除并获得点数

动态规划

  • 思路:
    • 选择元素 x,获得其点数,删除 x + 1 和 x - 1,则其他的 x 的点数也会被获得;
    • 可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;
    • 则问题转换成了不能同时获得相邻两个房间的金币并能获得最大收益问题:力扣198. 打家劫舍;
    • 动态规划状态转移方程 dpi 跟之前两个状态相关,可以使用滚动数组的方式,减少空间复杂度:
      • dpi = std::max(dpi - 2 + numsi, dpi - 1)
      • dp0 -> dpi - 2, dp0' = dpi - 1
      • dp1 -> dpi - 1, dp1' = dpi
      • 在使用一个临时变量:
        • tmp = dpi - 1 -> dp1
        • dpi | -> dp1' <- dp1 = std::max(dpi - 2 -> dp0 + numsi, dpi - 1 -> dp1)
        • dpi - 1 | -> dp1 -> tmp
cpp 复制代码
class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int maxVal = 0;
        for (int val : nums) {
            maxVal = std::max(maxVal, val);
        }

        std::vector<int> sum(maxVal + 1);
        for (int val : nums) {
            sum[val] += val;
        }

        return rob(sum);
    }

private:
    int rob(std::vector<int>& nums) {
        int size = nums.size();
        if (size == 0) {
            return 0;
        }
        if (size == 1) {
            return nums[0];
        }

        int dp0 = nums[0];
        int dp1 = std::max(dp0, nums[1]);
        for (int i = 2; i < size; ++i) {
            int tmp = dp1;
            dp1 = std::max(dp0 + nums[i], dp1);
            dp0 = tmp;
        }

        return dp1;
    }
};

相关推荐
我命由我1234512 分钟前
田野笔记极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
yi0111 小时前
DAY28: LeetCode 111. 二叉树的最小深度
人工智能·笔记·python·算法·leetcode·二叉树·递归
wuyk5551 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
xiangyun612 小时前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5852 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
信奥卷王2 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法
酒醉的胡铁2 小时前
相似度搜索的常见算法
算法·ai
局部有解2 小时前
Leetcode Hot100 - 最长连续序列
算法·leetcode·职场和发展
行者全栈架构师3 小时前
给开源 Rust 工具加一个新检查项,TRAE 帮我从想法跑到构建产物:全链路实战
前端·算法·架构
行者全栈架构师3 小时前
【鸿蒙心迹】冷启动从 2.8s 优化到 0.9s——耗时拆解与数据对比实战(HarmonyOS 7.x)
前端·算法·架构