国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python求最大連續子數組的和

2020-02-15 22:14:15
字體:
來源:轉載
供稿:網友

拋出問題:

求一數組如 l = [0, 1, 2, 3, -4, 5, -6],求該數組的最大連續子數組的和 如結果為[0,1,2,3,-4,5] 的和為7

問題分析:

這個問題很簡單,直接暴力法,上代碼。

# -*- coding:utf-8 -*-# 日期:2018/6/9 7:46# Author:小鼠標# 最大連續子數組的和l = [0, 1, 2, 3, -4, 5, -6]# 暴力求解def violence(l = []): maxVal = 0 x,y=0,0 for i in range(0,len(l)+1):  for j in range(0,len(l)+1):   res = sum(l[i:j])   if res > maxVal:    maxVal = res    x = i    y = j return maxVal,x,ymaxVal, x, y = violence(l)print(maxVal,(x,y))

分治法:

關鍵是暴力法的時間復雜度太高,所以就在原有的基礎上做了進一步的提升--分治法。

所謂分治法就是將原有的列表一分為二,那么最大的子列表只有三種情況:

1、最大子列表完全在左邊

2、最大子列表完全在右邊

3、最大子列表跨立在中間

所以我們分情況討論,求出答案。這種方法一定程度的降低了時間復雜度,從之前的n^2降到了(n/2)^2 + 2n

# -*- coding:utf-8 -*-# 日期:2018/6/9 7:46# Author:小鼠標# 最大連續子數組的和l = [0, 1, 2, 3, -4, 5, -6]#暴力求解def violence(l = []): maxVal = 0 x,y=0,0 for i in range(0,len(l)+1):  for j in range(0,len(l)+1):   res = sum(l[i:j])   if res > maxVal:    maxVal = res    x = i    y = j return maxVal,x,y#分治法 想左掃 向右掃,求出兩邊的最大值def left_or_right(l): maxVal = 0 term = 0 for i in l:  term += i  if maxVal < term:   maxVal = term return maxValdef Separate(): middle = int(len(l)/2) l1 = l[0:middle] l2 = l[middle:len(l)] #左半部分 maxVal1,x1,y1 = violence(l1) #右半部分 maxVal2,x2,y2 = violence(l2) #跨立在中間 max_right = left_or_right(l2) max_left = left_or_right(l1[::-1]) maxVal3 = max_right + max_left return max(maxVal1,maxVal2,maxVal3)val = Separate()print(val) 

動態規劃:

即便是分治法,時間復雜度還是太高,不滿足生產的需求,所以如果說只求最大子序列的和的值而不去追求最大子序列本身,我們又引出一個方法--動態規劃

這種方法的時間復雜是是線性的,極大的降低了。

# -*- coding:utf-8 -*-# 日期:2018/6/9 8:38# Author:小鼠標def function(lists): max_sum = lists[0] pre_sum = 0 for i in lists:  # 因為最大子列表一定是從一個非0的數開始的(假定列表中有正數有負數)  # 所以就可以暫時篩選調小于0的數,即便列表全是負數,那么最大的子列表肯定是負數最大的一個  if pre_sum < 0:   pre_sum = i  else:   pre_sum += i  if pre_sum > max_sum:   max_sum = pre_sum return max_sumlists = [0, 1, 2, 3, -4, 5, -6]print(function(lists))             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广宗县| 新巴尔虎左旗| 沛县| 镇巴县| 盐边县| 靖江市| 武夷山市| 介休市| 台南县| 庄浪县| 页游| 台山市| 彰武县| 盱眙县| 宁津县| 商城县| 台前县| 天等县| 德保县| 宁明县| 阿鲁科尔沁旗| 登封市| 彰武县| 云浮市| 金秀| 禹州市| 蕉岭县| 苗栗市| 石楼县| 汤原县| 济南市| 天等县| 泰州市| 绵竹市| 芜湖市| 翼城县| 嵩明县| 威海市| 台江县| 新平| 蓬莱市|