題目描述:
一個有 n 個元素的數組,這 n 個元素既可以是正數也可以是負數,數組中連續
的一個或多個元素可以組成一個連續的子數組,一個數組可能有多個這種連續的子數組,求子數組的最大值。例如,對于數組 [1,-2,4,8,-4,7,-1,-5] 而言,其最大和的子數組為 [4,8,-4,7],最大值為 15。
方法:
蠻力法 重復利用已經計算的子數組和 動態規劃 優化的動態規劃1.蠻力法
找出所有的子數組,然后求出子數組的和,在所有子數組的和中取最大值。
代碼實現:
#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time : 2020/1/29 21:59# @Author : buu# @Software: PyCharm# @Blog :https://blog.csdn.net/weixin_44321080def maxSubArrSum(arr): if arr == None or len(arr) <= 0: print('參數不合理!') return thisSum = 0 maxSum = 0 i = 0 while i < len(arr): j = i while j < len(arr):# j 控制連續子數組包含的元素個數 thisSum = 0 k = i # k 表示連續子數組開始的下標 while k < j: thisSum += arr[k] k += 1 if thisSum > maxSum: maxSum = thisSum j += 1 i += 1 return maxSumif __name__ == '__main__': arr = [1, -2, 4, 8, -4, 7, -1, -5] print('1 max sub array sum:', maxSubArrSum(arr))
結果:
算法性能分析:
這種方法的時間復雜度為O(n3);
2.重復利用已經計算的子數組和
由于 sum[i,j] = sum[i,j-1] + arr[j],在計算 sum[i,j] 的時候可以使用前面已計算出的 sum[i,j-1] 而不需要重新計算,采用這種方法可以省去計算 sum[i,j-1] 的時間,從而提高效率。
代碼實現:
#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time : 2020/1/30 10:53# @Author : buu# @Software: PyCharm# @Blog :https://blog.csdn.net/weixin_44321080def maxSubArrSum(arr): if arr == None or len(arr) <= 0: print('參數不合理!') return maxSum = -2 ** 31 i = 0 while i < len(arr): # i: 0~7 sums = 0 j = i while j < len(arr): # j: 0~7 sums += arr[j] # sums 重復利用 if sums > maxSum: # 每加一次就判斷一次 maxSum = sums j += 1 i += 1 return maxSumif __name__ == '__main__': arr = [1, -2, 4, 8, -4, 7, -1, -5] print('2 max sub array sum:', maxSubArrSum(arr))
結果:
算法性能分析:
使用了雙重循環,時間復雜度為O(n2);
3.動態規劃
首先可以根據數組最后一個元素 arr[n-1] 與最大子數組的關系分為以下三種情況討論:
(包含或不包含,包含的話肯定以最后一個元素結尾;不包含的話,或者最后一個元素單獨構成最大子數組,或者轉換為求 arr[1…n-2] 的最大子數組)
新聞熱點
疑難解答