牛客網在線編程(21):連續最大和-python

序言

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章