class Solution:
def maximumUniqueSubarray(self, nums: List[int]) -> int:
'''
求一个连续的子数组,该子数组满足以下三个条件:
1,子数组中的所有元素都不同
2,子数组的和最大
3,子数组是连续的
'''
maxSum = -math.inf
windowSum = 0
hashMap = {}
start = 0
for end in range(len(nums)):
windowSum = windowSum + nums[end]
hashMap[nums[end]] = hashMap.get(nums[end],0) + 1
if end - start + 1 == len(hashMap):
maxSum = max(maxSum,windowSum)
while end - start + 1 > len(hashMap):
head = nums[start]
hashMap[head] = hashMap[head] - 1
if hashMap[head] == 0:
del hashMap[head]
windowSum = windowSum - head
start = start + 1
return maxSum
题目:
知识点:
滑动窗口
这道题目结合了 3. 无重复字符的最长子串 和 643. 子数组最大平均数 I
细节问题 / 提交出错点:
No.1
描述:滑动窗口首指针移动的契机
出错原因:
原错误写法:if end - start + 1 > len(hashMap):
修改后写法:while end - start + 1 > len(hashMap):
当滑动窗口内出现重复数据时,重复的数据并不一定总是首指针指向的数据。要使用while循环,清理滑动窗口中的数据,直到使得滑动窗口满足【子数组数据不重复的要求】
No.2
描述:求最大值的契机
出错原因:
原错误写法:
if hashMap[head] == 0:
del hashMap[head]
maxSum = max(maxSum,windowSum)
windowSum = windowSum - head
修改后写法:
if hashMap[head] == 0:
del hashMap[head]
windowSum = windowSum - head
在清理滑动窗口的过程中是不该更新子数组的最大和的,因为在该过程中,滑动窗口对应的数组是不满足子数组的3个求和条件的。
参考资料:
题解:力扣
这个滑动窗口的题解堪称神作!本人要沐浴焚香虔诚诵读100遍。