LeetCode 1695.删除子数组的最大得分:滑动窗口(哈希表)

【LetMeFly】1695.删除子数组的最大得分:滑动窗口(哈希表)

力扣题目链接:https://leetcode.cn/problems/maximum-erasure-value/

给你一个正整数数组 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 <= 105
  • 1 <= nums[i] <= 104

解题方法:滑动窗口

这道题翻译一下就是:找和最大的不包含相同元素的子数组。

怎么找?滑动窗口即可。

使用两个指针指向窗口的两个端点,窗口范围内的数组为以右指针r为终点的最长的子数组。

每次右指针右移一位,如果窗口中已经包含了要新加入的元素,就将左指针不断左移,直到窗口中不包含右指针指向的新元素为止。

如何快速判断窗口中一个元素是否已经存在?使用一个哈希表统计即可。

  • 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums)),左右指针每个元素各自最多遍历一次。
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-07-23 10:31:42
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-07-23 13:26:19
 */
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif

class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        unordered_set<int> had;
        int ans = 0, cnt = 0;
        for (int l = 0, r = 0; r < nums.size(); r++) {
            while (had.count(nums[r])) {
                had.erase(nums[l]);
                cnt -= nums[l++];
            }
            had.insert(nums[r]);
            cnt += nums[r];
            // printf("l = %d, r = %d, cnt = %d\n", l, r, cnt);
            ans = max(ans, cnt);
        }
        return ans;
    }
};

/*
[187,470,25,436,538,809,441,167,477,110,275,133,666,345,411,459,490,266,987,965,429,166,809,340,467,318,125,165,809,610,31,585,970,306,42,189,169,743,78,810,70,382,367,490,787,670,476,278,775,673,299,19,893,817,971,458,409,886,434]
9252
16911
*/
Python
python 复制代码
'''
Author: LetMeFly
Date: 2025-07-23 10:31:42
LastEditors: LetMeFly.xyz
LastEditTime: 2025-07-23 13:29:36
'''
from typing import List

class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        had = set()
        ans = l = cnt = 0
        for v in nums:
            while v in had:
                had.remove(nums[l])
                cnt -= nums[l]
                l += 1
            had.add(v)
            cnt += v
            ans = max(ans, cnt)
        return ans
Java
java 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-07-23 10:31:42
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-07-24 13:22:02
 */
import java.util.HashSet;
import java.util.Set;

class Solution {
    public int maximumUniqueSubarray(int[] nums) {
        int ans = 0;
        Set<Integer> had = new HashSet<>();
        for (int l = 0, r = 0, cnt = 0; r < nums.length; r++) {
            while (had.contains(nums[r])) {
                had.remove(nums[l]);
                cnt -= nums[l++];
            }
            had.add(nums[r]);
            cnt += nums[r];
            ans = Math.max(ans, cnt);
        }
        return ans;
    }
}
Go
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-07-23 10:31:42
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-07-24 13:16:17
 */
package main

// import "fmt"

func maximumUniqueSubarray(nums []int) (ans int) {
    had := map[int]struct{}{}
    l, cnt := 0, 0
    for _, t := range nums {
        for _, ok := had[t]; ok; _, ok = had[t] {
            delete(had, nums[l])
            cnt -= nums[l]
            l++
        }
        cnt += t
        had[t] = struct{}{}
        ans = max(ans, cnt)
    }
    return
}

// func main() {
//     nums := []int{4, 2, 4, 5, 6}
//     ans := maximumUniqueSubarray(nums)
//     fmt.Println(ans)
// }

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
闻缺陷则喜何志丹15 小时前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
寻星探路15 小时前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
wen__xvn15 小时前
力扣第 484 场周赛
算法·leetcode·职场和发展
YuTaoShao15 小时前
【LeetCode 每日一题】865. 具有所有最深节点的最小子树——(解法一)自顶向下
算法·leetcode·职场和发展
寻星探路15 小时前
【算法专题】哈希表:从“两数之和”到“最长连续序列”的深度解析
java·数据结构·人工智能·python·算法·ai·散列表
!停16 小时前
C语言单链表
c语言·数据结构·算法
独自破碎E16 小时前
【队列】求二叉树的层序遍历
leetcode
闻缺陷则喜何志丹16 小时前
【回文 字符串】3677 统计二进制回文数字的数目|2223
c++·算法·字符串·力扣·回文
Tisfy16 小时前
LeetCode 0085.最大矩形:单调栈
算法·leetcode·题解·单调栈
mit6.82416 小时前
出入度|bfs|状压dp
算法