說明:子列表指的是列表中索引(下標)連續的元素構成的列表;列表中的元素是int型別,可能包含正整數、0、負整數;程式輸入列表中的元素,輸出子列表元素求和的最大值,例如:如題,對於原列表a,假設元素a[i]為所求子列表的最後乙個元素,則所求子列表有兩種情況:輸入:1 -2 3 5 -3 2
輸出:8
輸入:0 -2 3 5 -1 2
輸出:9
輸入:-9 -2 -3 -5 -3
輸出:-2
1)不含a[i]之前的元素
2)含有a[i]之前的序列(該序列為之前累加得到)
所以求解過程為:對列表中每乙個元素作出上述假設並分別求解兩種情況,並比較記錄最大值。
具體實現如下,時間複雜度o(n),空間複雜度o(1):
def
maxsublist
(items)
: size =
len(items)
_sum = _max = items[0]
for i in
range(1
, size)
:#如果前面序列和的結果小於零 則丟棄(即從兩種情況中取最大值)
_sum =
max(
0, _sum)
_sum += items[i]
#每次累加後記錄最大值
_max =
max(_sum, _max)
return _max
defmain()
: items =
list
(map
(int
,input()
.split())
) result = maxsublist(items)
print
(result)
if __name__ ==
'__main__'
: main(
)
考慮題目給定的序列首尾相連的情況(即構成乙個環狀),此時問題也可分為兩種情況分下:
1)所求子串行不跨過首尾,此時問題就與一開始提出的一致,用上述方法求解即可。
2)所求子串行跨過首尾,即排除掉的序列一定不跨過首尾,通過求解排除掉的序列從而求得結果,此時問題變成情況1)的反問題:」求解子串行的最小和「,用總序列和減去最小序列和即是所求結果。
實現如下:
def
maxsublist
(items)
: size =
len(items)
_sum = _max = items[0]
for i in
range(1
, size)
: _sum =
max(
0, _sum)
_sum += items[i]
_max =
max(_sum, _max)
return _max
defminsublist
(items)
: size =
len(items)
_sum = _min = items[0]
for i in
range(1
, size)
: _sum =
min(
0, _sum)
_sum += items[i]
_min =
min(_sum, _min)
return _min
defmain()
: items =
list
(map
(int
,input()
.split())
) result =
max(maxsublist(items)
,sum
(items)
- minsublist(items)
)print
(result)
if __name__ ==
'__main__'
: main(
)
python實現求解最大連續子串行
def maxsum list max list 0 for i in range 0,len list 子串行開始位置 sum list i for j in range i 1,len list 子串行結束位置 sum list j 子串行求和 if sum max 最大值儲存凌駕於整個子串行迴...
最大連續子串行之和,最大連續子串行乘積
最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...
最大連續子串行
e 最大連續子串行 description 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和 為20。在今年的資料結構考卷中,要求編寫程式得到最大和,現在增加乙個要求,即還需要輸出該 子串行...