""" 給定一個整數數組 nums ,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。 來源:力扣(LeetCode) 連接:https://leetcode-cn.com/problems/maximum-subarray 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。 """ """ author:jiyanjiao date :2019-10-22 """ class Solution: max_index = 0 # 子數組和最大的索引 max_sum = 0 # 子數組和的最大值 sum_list = [] # 子數組和的列表 sub_list = [] # 最大和的子數組列表 def maxSubArray(self, nums_list, le) -> int: """ :param nums_list: 傳入的數組 :param le: 指望的子數組的長度 :return: 子數組和最大值,最大和的子數組的列表 """ if le > len(nums_list): raise Exception('子數組長度大於父數組長度') elif le < 1 or len(nums_list) == 0: raise Exception("父數組不能爲空,或者,子數組至少包含一個元素") elif le == len(nums_list): raise Exception("僅有一組數不符合規則") # 求指定長度子數組的和 for i in range(len(nums_list)-1): s_sum = 0 for j in range(i, i+le): # 子數組順序的組合狀況,去掉最後一組不夠長度的子數組 if len(nums_list) % le == 0: s_sum += nums_list[j] else: s_sum += nums_list[j-1] i += 1 self.sum_list.append(s_sum) # 求子數組和的最大值,和最大值索引 for i in range(len(self.sum_list)-1): for j in range(i+1, len(self.sum_list)): if len(nums_list) % le == 0: if self.sum_list[i] > self.sum_list[j]: self.max_sum = self.sum_list[i] self.max_index = i else: self.max_sum = self.sum_list[j] self.max_index = j else: if self.sum_list[i] > self.sum_list[j]: self.max_sum = self.sum_list[i] self.max_index = i else: self.max_sum = self.sum_list[j] self.max_index = j-1 # 根據子數組和的最大值索引算出子數組在符數組中索引 for i in range(self.max_index-1, self.max_index+le): self.sub_list.append(nums_list[i]) print("傳入的數組是{},{}個長度的連續子數組最大和爲{},最大和的數組爲{}".format(nums_list, le, self.max_sum, self.sub_list)) # 求數組中的值的和 本次未用到 def sumArray(self, num_list): sum = 0 for i in range(len(num_list)): sum += num_list[i] return sum # Your MedianFinder object will be instantiated and called as such: if __name__ == '__main__': pass # obj = MedianFinder() # obj.addNum(1) # obj.addNum(2) # obj.addNum(4) # obj.addNum(3) # obj.addNum(5) # param_2 = obj.findMedian() s = Solution() # s.maxSubArray([1,2,3,4,5,6]) s.maxSubArray([-1,2,1,0,0],3)
注: 這是小編自行整理,僅僅是實現了功能,不設計算法,正確的解法以下:有待研究~~算法
''' 1. 暴力求解 基本思路就是遍歷一遍,用兩個變量,一個記錄最大的和,一個記錄當前的和。時空複雜度貌似還不錯......(時間複雜度 O(n)O(n),空間複雜度 O(l)O(l)) ''' class Solution: def maxSubArray(self, nums: List[int]) -> int: tmp = nums[0] max_ = tmp n = len(nums) for i in range(1,n): # 噹噹前序列加上此時的元素的值大於tmp的值,說明最大序列和可能出如今後續序列中,記錄此時的最大值 if tmp + nums[i]>nums[i]: max_ = max(max_, tmp+nums[i]) tmp = tmp + nums[i] else: #當tmp(當前和)小於下一個元素時,當前最長序列到此爲止。以該元素爲起點繼續找最大子序列, # 並記錄此時的最大值 max_ = max(max_, tmp, tmp+nums[i], nums[i]) tmp = nums[i] return max_ ''' 做者:pandawakaka 連接:https://leetcode-cn.com/problems/maximum-subarray/solution/bao-li-qiu-jie-by-pandawakaka/ 來源:力扣(LeetCode) 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。 '''