项目场景:
给你一个整数数组 nums
和两个正整数 m
和 k
。
请你返回 nums
中长度为 k
的 几乎唯一 子数组的 最大和 ,如果不存在几乎唯一子数组,请你返回 0
。
如果 nums
的一个子数组有至少 m
个互不相同的元素,我们称它是 几乎唯一 子数组。
子数组指的是一个数组中一段连续 非空 的元素序列。
示例 1:
输入:nums = [2,6,7,3,1,7], m = 3, k = 4 输出:18 解释:总共有 3 个长度为 k = 4 的几乎唯一子数组。分别为 [2, 6, 7, 3] ,[6, 7, 3, 1] 和 [7, 3, 1, 7] 。这些子数组中,和最大的是 [2, 6, 7, 3] ,和为 18 。
示例 2:
输入:nums = [5,9,9,2,4,5,4], m = 1, k = 3 输出:23 解释:总共有 5 个长度为 k = 3 的几乎唯一子数组。分别为 [5, 9, 9] ,[9, 9, 2] ,[9, 2, 4] ,[2, 4, 5] 和 [4, 5, 4] 。这些子数组中,和最大的是 [5, 9, 9] ,和为 23 。
示例 3:
输入:nums = [1,2,1,2,1,2,1], m = 3, k = 3 输出:0 解释:输入数组中不存在长度为k = 3
的子数组含有至少m = 3
个互不相同元素的子数组。所以不存在几乎唯一子数组,最大和为 0 。
提示:
1 <= nums.length <= 2 * 104
1 <= m <= k <= nums.length
1 <= nums[i] <= 109
问题描述
这题也是典型的定长滑动窗口的问题。我们首先计算前n-1个元素的和记为s,cnt为子数组中每个元素出现的个数。之后我们不断遍历,out为出,into为进,遍历开始时加入into此时子数组长度为k,into的出现次数加一。如果cnt的长度大于m,则更新ans的值,之后将out从s中减去,如果out的次数减为0的话删除此元素,最终返回ans即可。
class Solution:
def maxSum(self, nums: List[int], m: int, k: int) -> int:
ans=0
s=sum(nums[:k-1])
cnt=Counter(nums[:k-1])##先算n-个数
for out,into in zip(nums,nums[k-1:]):
s+=into
cnt[into]+=1
if len(cnt)>=m:
ans=max(ans,s)
s-=out
cnt[out]-=1
if cnt[out]==0:
del cnt[out]
return ans
本题提交情况。
以上为本篇文章的全部内容,感谢你抽出宝贵的时间阅读这篇文章。如果你有任何疑问或建议,欢迎在评论区留言,我们一起交流进步。愿你的代码之路越走越顺,生活充满阳光!