首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)

LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)

作者头像
Michael阿明
发布2021-02-19 15:01:08
发布2021-02-19 15:01:08
7210
举报

文章目录

1. 题目

给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素子数组。 删除子数组的 得分 就是子数组各元素之 和

返回 只删除一个 子数组可获得的 最大得分

如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],…,a[r] ,那么它就是 a 的一个子数组。

代码语言:javascript
复制
示例 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^5
1 <= nums[i] <= 10^4

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-erasure-value 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 先计算前缀和,方便后面快速获取
  • 滑动窗口内的数字存入哈希set,如果当前数字在set中,则窗口左端点向右移动,直至左端点该数字出现
代码语言:javascript
复制
class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        int ans = 0, i = 0, j = 0, n = nums.size();
        vector<int> presum(nums);
        for(int i = 1; i < n; i++) 
            presum[i] += presum[i-1];//前缀和
        unordered_set<int> 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++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档