LeetCode学习笔记(1695)——删除子数组的最大得分

前言

解题代码和方法均参考leetcode官方代码,仅记录学习过程和对代码的理解学习。

题目

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

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

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

输入:nums = [4,2,4,5,6]
输出:17
解释:最优子数组是 [2,4,5,6]

解题理解

首先定义一个列表,此处nums:list[int]是Python 变量类型注解,它表示 nums 是一个列表,其中包含的元素为整数(int)类型;

然后定义两个变量left和res并赋值为0;

defaultdict(int)创建一个默认值为0的列表;

然后是一个使用 enumerate() 函数的 for 循环语句。enumerate() 函数用于遍历一个可迭代对象(如列表、字符串等)并返回索引和对应的元素。

class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        left,res = 0,0
        cnt = defaultdict(int) # 标配用来记录当前每个数字出现的次数
        sum_ = 0
        for right,num in enumerate(nums):
            cnt[num]+=1 # 二话不说,直接哈希表统计
            sum_ += num # 题目得分是和的概念,所以来一个sum_统计一下和
            if cnt[num]==1: #满足条件(加入新对象后,也没有重复的。注意,这里是配合后面使用的,因为后续的while,剔除了重复的部分)
                res = max(res,sum_)
            while cnt[num]>1: # 如果出现重复,开始移动窗口
                cnt[nums[left]]-=1
                sum_ -= nums[left]
                if cnt[nums[left]]==0:
                    del cnt[nums[left]]
                left+=1
        return res

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值