【小白友好】LeetCode 删除并获得点数

2024-03-05 08:44

本文主要是介绍【小白友好】LeetCode 删除并获得点数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础题

打家劫舍https://leetcode.cn/problems/house-robber/

小白解法

  • 删除nums[i]就会使得所有nums[i]-1nums[i]+1的值都消失,手写了几个,发现找来找去不方便,还不如先排个序,然后这样nums[i]-1nums[i]nums[i]+1就能靠在一起了,这样删的时候方便找。
  • 只要获得一次nums[i]的点数那么肯定是要一起把所有的nums[i]都要带上的,也就是获得nums[i]*nums[i]次数个点数

嗯,发现[1,1,1,2,2,3,4,5]的时候怎么这么熟悉,选1就不能选2,选2就不能选3,这不是相邻的2个数不能一起选?这不是打家劫舍吗?

但是也有所区别,当相邻的2个值相差不是1时,可以直接获得,不需要“打家劫舍”。我们此时说的“相邻”是在[1,2,3,4]这个新构造的数组上的相邻,而不是原数组[1,1,1,2,2,3,4,5]未知的相邻。 也就是把每个相同元素的数字看成1个数,其对应的能获得点数是nums[i]*nums[i]次数

那么要怎么新构造的数组?可以使用C++风格的直接[0 for i in range(max(nums))]构造一个可能超长的数组,然后把对应位置的元素填上,解起来就跟打家劫舍的写法一模一样了;也可以使用一个字典num2value,统计key能获得的value,然后在判断的时候加入是否abs(nums[i]-nums[i-1])==1

我个人还是倾向于字典的写法:

class Solution:def deleteAndEarn(self, nums: List[int]) -> int:# 统计每个数字对应能获得的点数from collections import defaultdictnum2value=defaultdict(int)for n in nums:num2value[n]+=n# 构造新数组sorted_nums        sorted_nums=sorted(set(nums))if len(sorted_nums)==1:return num2value[nums[0]]if len(sorted_nums)==2:if abs(sorted_nums[0]-sorted_nums[1])==1:return max(num2value[sorted_nums[0]],num2value[sorted_nums[1]])else:return num2value[sorted_nums[0]]+num2value[sorted_nums[1]]# 上述特殊情况# 下面是初始化+转移方程dp=[0 for _ in range(len(sorted_nums))]dp[0]=num2value[sorted_nums[0]]if abs(sorted_nums[0]-sorted_nums[1])==1:# 如果是相邻元素,那么就是打家劫舍式的更新dpdp[1]= max(num2value[sorted_nums[0]],num2value[sorted_nums[1]])else:# 若不是,可以直接+,不受影响dp[1]= num2value[sorted_nums[0]]+num2value[sorted_nums[1]]for i in range(2,len(sorted_nums)):if abs(sorted_nums[i]-sorted_nums[i-1])!=1:dp[i]=dp[i-1]+num2value[sorted_nums[i]]else:select_now=num2value[sorted_nums[i]]+dp[i-2]unselect_now=dp[i-1]dp[i]=max(select_now,unselect_now)# print(dp)return dp[-1]

在写完下方的一般情况后,仍然不要忘了特殊情况,下方的下标是有i-1和i-2的,这两种需要单独去返回。

不得不说小白写法写的真的很繁琐,不优美,但是便于理解。

这篇关于【小白友好】LeetCode 删除并获得点数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T