LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)
发布日期:2021-07-01 03:35:04
浏览次数:2
分类:技术文章
本文共 1290 字,大约阅读时间需要 4 分钟。
文章目录
1. 题目
给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。
删除子数组的 得分 就是子数组各元素之 和 。返回 只删除一个 子数组可获得的 最大得分 。
如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],…,a[r] ,那么它就是 a 的一个子数组。
示例 1:输入:nums = [4,2,4,5,6]输出:17解释:最优子数组是 [2,4,5,6]示例 2:输入:nums = [5,2,1,2,5,2,1,2,5]输出:8解释:最优子数组是 [5,2,1] 或 [1,2,5] 提示:1 <= nums.length <= 10^51 <= nums[i] <= 10^4
来源:力扣(LeetCode)
链接: 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 先计算前缀和,方便后面快速获取
- 滑动窗口内的数字存入哈希set,如果当前数字在set中,则窗口左端点向右移动,直至左端点该数字出现
class Solution { public: int maximumUniqueSubarray(vector & nums) { int ans = 0, i = 0, j = 0, n = nums.size(); vector presum(nums); for(int i = 1; i < n; i++) presum[i] += presum[i-1];//前缀和 unordered_set s; while(j < n) { if(s.find(nums[j]) == s.end()) { s.insert(nums[j]); } else//存在nums[j] { while(nums[i] != nums[j]) { s.erase(nums[i++]); } i++;//左端点和nums[j]一样的数跳过了 } ans = max(ans, i>0 ? presum[j]-presum[i-1] : presum[j]); j++; } return ans; }};
720 ms 116.1 MB C++
我的CSDN
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
转载地址:https://michael.blog.csdn.net/article/details/111415907 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月18日 03时50分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
只有1%的程序员搞懂过浮点数陷阱
2019-05-01
一名 Google 工程师的大数据处理经验
2019-05-01
命名难,难于上青天
2019-05-01
没钱没公司,怎么做一款付费产品
2019-05-01
代码整洁之道-编写 Pythonic 代码
2019-05-01
树莓派程序开机自启动
2019-05-01
连锁门店无线通信方案
2019-05-01
配置Lotus Domino集群视频详解
2019-05-01
Linux软件万花筒
2019-05-01
全球开源软件发展趋势分析
2019-05-01
Linux常用的安全工具
2019-05-01
python 多进程之进程池的操作
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01