前言
解题代码和方法均参考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