序言
这是2017年滴滴的一道题目,但是2018年出现了它的变种题目,我会同时为大家提供出本题和变种后题目的代码
题目描述
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
示例1
输入
3
-1 2 1
输出
3
代码实现
n=input()
lis=list(map(int,input().split()))
def func(lis):
result=lis[0]
tem=0
for item in lis:
if tem<0:
tem=item
else:
tem+=item
result=max(result,tem)
return result
print(func(lis))
进阶题目描述
这次我们不直接去找最大的连续和,而是可以先将数组中的若干个数字变换符号(正数变为负数或者负数变为正数),然后找出连续的数的和的绝对值最大为多少?
这时候第1行 输入为两个数n,k,其中k为最多更改符号的次数。
还以上面的示例为例,假如k为1,那么我们可以将-1改为1,最后的结果就为4.
再给几个示例:k=1时,-5 -3 1返回结果9(将1改为-1,那么-5-3-1=-9,再取绝对值就是9)
k=2时,-1 -2 -3 -4 返回结果7
代码实现
n,num=map(int,input().split())
lis=list(map(int,input().split()))
def qufan(x):
return -x
def func(lis,num=0,flag=False): #num为可以最多更改的次数,默认是0,flag是要不要对数组中所有的数取反,默认是Flase
if flag:
lis=list(map(qufan,lis))
result=lis[0]
flg=1
while True:
tem=0
flg_=0
num_=num
for item in lis:
if item<0:
flg_+=1
if num_>0 and flg-flg_<=0:
item=abs(item)
num_-=1
if tem<0:
tem=item
else:
tem+=item
result=max(result,tem)
flg+=1
if num_>0 or num==0:
break
return result
print(str(max(func(lis,num,True),func(lis,num))))