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中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

MybatisPlus中removeById删除数据库未变解决方案

《MybatisPlus中removeById删除数据库未变解决方案》MyBatisPlus中,removeById需实体类标注@TableId注解以识别数据库主键,若字段名不一致,应通过value属... 目录MyBATisPlus中removeBypythonId删除数据库未变removeById(Se

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态