The Day Two 找到一個具備最大和的連續子數組,返回其最大和

"""
給定一個整數數組 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)
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
'''
相關文章
相關標籤/搜索