序言
這是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))))