6230. 长度为 K 子数组中的最大和

82 阅读1分钟

题目:
给你一个整数数组 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
}