IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode740. 删除并获得点数 -> 正文阅读

[数据结构与算法]leetcode740. 删除并获得点数

题目链接:https://leetcode-cn.com/problems/delete-and-earn/

题意:

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

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

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

?方法:动态规划+哈希表

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        //此题类似于打家劫舍
        map<int,int> mp;//哈希表,存储映射关系<数字,出现的次数>
        for(int num:nums)//将nums中的数组存储到哈希表中
        {
            mp[num]++;//更新哈希表
        }
        int size = mp.size();//存储哈希表的长度
        if(size==0)  return 0;//如果哈希表中没有项
        else if(size==1) return mp.begin()->first*mp.begin()->second;//如果哈希表中恰好只有一项,返回对应的key*value
        vector<int> dp(10002,0);//dp数组,dp[i]表示前i个数里能获取到的最大点数
        int maxV = 0;//存储最大点数
        dp[0] = 0;//初始化dp数组的第一个值
        int pre = 0,ppre=0;//前一个哈希项的key,前前个哈希项的key
        for(auto iter=mp.begin();iter!=mp.end();iter++)
        {
            if(pre==0)//如果前一个元素是0,说明目前是哈希项中的第一项
            {
                dp[iter->first] = iter->first*iter->second;//更新dp数组
                maxV = max(dp[iter->first],maxV);//更新最大点数
                pre = iter->first;//更新前一个元素的值,相对于下一个元素,目前元素就是前一个元素
            }else//如果不是首元素
            {
                if(iter->first-pre==1)//与前一项相差刚好为1,目前项不能选,需要权衡比较,取最大的dp值
                {
                    dp[iter->first] = max(dp[pre],dp[ppre]+iter->first*iter->second);
                }else//前一项和目前的差值大于1,那只要把当前的最大点数和当前项的所有点数相加即可
                {
                    dp[iter->first] = maxV+iter->first*iter->second;
                }
                ppre = pre;//更新前前项
                pre = iter->first;//更新前一项
                maxV = max(dp[iter->first],maxV);//更新最大点数
            }    
        }
        return maxV;
    }
};

?优化dp数组后:

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        //此题类似于打家劫舍
        map<int,int> mp;//哈希表,存储映射关系<数字,出现的次数>
        for(int num:nums)//将nums中的数组存储到哈希表中
        {
            mp[num]++;//更新哈希表
        }
        int size = mp.size();//存储哈希表的长度
        if(size==0)  return 0;//如果哈希表中没有项
        else if(size==1) return mp.begin()->first*mp.begin()->second;//如果哈希表中恰好只有一项,返回对应的key*value
        vector<int> dp(size+1,0);//dp数组,dp[i]表示前i项里能获取到的最大点数
        int maxV = 0;//存储最大点数
        dp[0] = 0;//初始化dp数组的第一个值
        int index = 1;//记录dp数组中项的序号
        int pre = 0;//前一个哈希项的key
        for(auto iter=mp.begin();iter!=mp.end();iter++)
        {
            if(pre==0)//如果前一个元素是0,说明目前是哈希项中的第一项
            {
                dp[index] = iter->first*iter->second;//更新dp数组
                maxV = max(dp[index],maxV);//更新最大点数
                index++;//对应项的序号自加
                pre = iter->first;//更新前一个元素的值,相对于下一个元素,目前元素就是前一个元素
            }else//如果不是首元素
            {
                if(iter->first-pre==1)//与前一项相差刚好为1,目前项不能选,需要权衡比较,取最大的dp值
                {
                    dp[index] = max(dp[index-1],dp[index-2]+iter->first*iter->second);
                }else//前一项和目前的差值大于1,那只要把当前的最大点数和当前项的所有点数相加即可
                {
                    dp[index] = maxV+iter->first*iter->second;
                }
                pre = iter->first;//更新前一项
                maxV = max(dp[index],maxV);//更新最大点数
                index++;//更新序号
            }    
        }
        return maxV;
    }
};

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:59:24  更:2021-08-16 12:00:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:54:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码