leetcode 1695. 删除子数组的最大得分 中等

给你一个正整数数组 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^5
  • 1 <= nums[i] <= 10^4

分析:用一个 index 数组,记录 nums 数组中每个数出现的下标,初始化为 -1。遍历 nums 数组,最初时取得的最优子数组区间的左端点 l = 0,右端点为循环下标 i。如果 numsi 为 -1,说明还没有出现过,则将当前的子数组和 sum 加上 numsi,并修改 indexnums\[i] = i。如果numsi 不为 -1,则将 l 到 numsi 的所有值从 sum 中减去, 并更新 index 数组中对应值的下标为 -1,表示去掉这些值,最后把 l 更新为上一次 numsi 出现位置的后一位。遍历完数组,取 sum 的最大值即可。

cpp 复制代码
int maximumUniqueSubarray(int* nums, int numsSize) {
    int index[100010]={0};
    for(int i=0;i<100010;++i)
        index[i]=-1;
    int ans=0,sum=0,l=0;
    for(int i=0;i<numsSize;++i)
    {
        if(index[nums[i]]!=-1) 
        {
            int r=index[nums[i]];
            for(int j=l;j<=r;++j)
                sum-=nums[j],index[nums[j]]=-1;
            l=r+1;
        }
        sum+=nums[i],index[nums[i]]=i,ans=fmax(sum,ans);
    }
    ans=fmax(sum,ans);
    return ans;
}
相关推荐
All for pursuit.1 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
All for pursuit.15 小时前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
All for pursuit.17 小时前
【二分查找-2】34.在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode
blxr_21 小时前
力扣hot100爬楼梯https://leetcode.cn/problems/climbing-stairs/
算法·leetcode·职场和发展
Navigator_Z1 天前
LeetCode //C - 1275. Find Winner on a Tic Tac Toe Game
c语言·算法·leetcode
All for pursuit.1 天前
【分治-2】215.数组中的第K个最大元素
数据结构·c++·算法·leetcode
blxr_1 天前
力扣hot100前k个高频元素https://leetcode.cn/problems/top-k-frequent-elements/
算法·leetcode·职场和发展
longlongzihan1 天前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
smj2302_796826522 天前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode
青山木2 天前
Hot 100 --- 下一个排列
java·数据结构·算法·leetcode