leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP)

2023-12-31 19:18

本文主要是介绍leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

https://leetcode.com/problems/delete-and-earn/
在这里插入图片描述

题解

建立 help 数组,相当于一个(正向)索引表。

先排序,因为删除的顺序不影响最优结果(实际上是影响结果的,只不过最优解一定是从小到大删除的,因为如果先删除中间的元素的话,它的两边可能被误伤,而如果从边缘开始删除的话,只能误伤到一侧。)

class Solution {public int deleteAndEarn(int[] nums) {Map<Integer, Integer> map = new HashMap<>();for (int n : nums) {int count = map.getOrDefault(n, 0);map.put(n, count + 1);}int[][] help = new int[map.keySet().size()][2];int p = 0;for (int k : map.keySet()) {help[p][0] = k;help[p++][1] = map.get(k);}// 删除顺序不影响结果(至少从小到大删除结果不会更差),所以先排序Arrays.sort(help, Comparator.comparingInt(o -> o[0]));// Approach 2: Recursion with Memoization
//        return process(help, 0, dp);// Approach 3: Dynamic Programmingint[] dp = new int[help.length + 2];Arrays.fill(dp, -1);dp[help.length] = 0;dp[help.length + 1] = 0;for (int i = help.length - 1; i >= 0; i--) {int step = (i + 1 < help.length && help[i][0] + 1 == help[i + 1][0]) ? 2 : 1;dp[i] = Math.max(dp[i + 1], dp[i + step] + help[i][0] * help[i][1]);}return dp[0];}// 在当前i位置,删或不删,能够获得的最大收益
//    public int process(int[][] help, int i, int[] dp) {
//        if (i >= help.length) return 0;
//        if (dp[i] >= 0) return dp[i];
//
//        int step = (i + 1 < help.length && help[i][0] + 1 == help[i + 1][0]) ? 2 : 1;
//        int p1 = process(help, i + 1, dp); // 不删i位置
//        int p2 = process(help, i + step, dp) + help[i][0] * help[i][1]; // 删i位置
//
//        dp[i] = Math.max(p1, p2);
//        return dp[i];
//    }
}

在这里插入图片描述

这篇关于leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556925

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数