题目:
樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从O-N的箱子,每个箱子上面贴有一个数字.
阿里巴巴念出一个咒语数字k(k<N),找出连续k个宝箱数字和的最大值一,并输出该最大值。输入描述
第一行输入一个数字字串,数字之间使用逗号分隔,例如: 2,10,-3,-8,40,5。1s字串中数字的个数≤100000
-10000≤每个数字≤10000
第二行输入咒语数字,例如:4,咒语数字大小小于宝箱的个数输出描述
连续k个宝箱数字和的最大值,例如:39示例1:
输入
2,10,-3,-8,40,54
输出39示例2:输入81输出8
思路:
1:题目最关键的—句话:找出连续k个宝箱数字和的最大值。
2:这不就是滑动窗口,长度为k的最大窗口和,leetcode 原题,最基础的滑动窗口题目。3: leetcode满分题解!
要求:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++262144K,其他语言524288K64bit lO Format: %olld
语言限定:
C(clang11) ,C++ (clang++11) , Pascal (fpc 3.0.2) , Java (javac 1.8) ,Python2 (2.7.3),
PHP(7.4.7),C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript. Node(12.18.2), JavaScript V8(6.0.0),Sqlite(3.7.9),R(4.0.3),Go(1.14.4),Ruby(2.7.1),Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1),Rust(1.44),Scala(2.11.12), Kotlin(1.4.10),Groovy(3.0.6),TypeScript(4.1.2),Mysql(8.0)
Code:
# coding:utf-8
#JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
import functools
import sys
from collections import Counter, defaultdict
import collections
import copy
from itertools import permutations
import re
import math
import sys
import bisect
def maximumSubarraySum(nums, k) :
ans = 0
cnt = Counter(nums[:k - 1])
s = sum(nums[:k - 1])
for in_, out in zip(nums[k - 1:], nums):
cnt[in_] += 1 # 移入元素
s += in_
if len(cnt) == k:
ans = max(ans, s)
cnt[out] -= 1 # 移出元素
if cnt[out] == 0:
del cnt[out] # 重要:及时移除个数为 0 的数据
s -= out
return ans
nums = [int(x) for x in input().split(",")]
k = int(input())
print(maximumSubarraySum(nums, k))