题目:
给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:
- 子数组的长度是
k,且 - 子数组中的所有元素 各不相同 。
返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。
子数组 是数组中一段连续非空的元素序列。
算法:
方法一:模拟
func maximumSubarraySum(nums []int, k int) int64 {
ans := int64(0)
// 取长度为k数组求和,有重复直接跳过
existMap := make(map[int]struct{})
n := len(nums)
start := 0
sum := int64(0)
for i := 0; i < n; i ++ {
// 数字在当前array已经出现过了,清除历史记录
if _, ok := existMap[nums[i]]; ok {
start = i
existMap = make(map[int]struct{})
sum = 0
}
existMap[nums[i]] = struct{}{}
sum = sum + int64(nums[i])
if i - start + 1 == k {
// fmt.Println(start, i, sum)
if sum > ans {
ans = sum
}
delete(existMap, nums[start])
sum = sum - int64(nums[start])
start ++
}
}
return ans
}