LintCode Python 簡單級題目 41.最大子數組 - 44.最小子數組和


題目1 最小子數組

描述:

給定一個整數數組,找到一個具有最小和的子數組。返回其最小和。

 注意事項

子數組最少包含一個數字

樣例

給出數組[1, -1, -2, 1],返回 -3

標簽 
 
題目2 最大子數組
描述:

給定一個整數數組,找到一個具有最大和的子數組,返回其最大和。

 注意事項

子數組最少包含一個數

樣例

給出數組[−2,2,−3,4,−1,2,1,−5,3],符合要求的子數組為[4,−1,2,1],其最大和為6

挑戰 

要求時間復雜度為O(n)

標簽 
 
 
題目分析:
題目1求最小子數組和,題目沒有寫要求算法復雜度,可以考慮Python的數組切片功能,只能獲取子數組,然后求和,獲取最小值
通過動態規划,依次獲取nums[i:j]的子數組和,算法復雜度O(n*logn)
def minSubArray(nums):
    max = min = sum(nums)
    maxList = minList = nums
    n = len(nums)+1
    for i in range(n+1):
        for j in range(i+1,n+1):
            sonList = nums[i:j]
            Sum = sum(sonList)
            if Sum >= max:
                max = Sum
                maxList = sonList
            elif Sum < min:
                min = Sum
                minList = sonList
    print maxList,sum(maxList)
    print minList, sum(minList)

  

題目二要求算法復雜度O(n),上訴動態規划算法不符合要求,使用貪心算法:

class Solution:
    """
    @param nums: A list of integers
    @return: An integer denote the sum of maximum subarray
    """
    def maxSubArray(self, nums):
        # write your code here
        n = len(nums)
        maxSum = sum(nums)
        curSum = 0
        for i in range(n):
            # 從i開始求和,如果當前和大於maxSum,則賦值給maxSum
            curSum += nums[i]
            if curSum > maxSum:
                maxSum = curSum
            # 前面的和如果已經小於0了,那么加上下一個元素值,肯定是小於下一個元素值
            # 所以如果前面加起來的值小於0了,則舍棄前面的和,從下一位開始繼續求和
            if curSum < 0:
                curSum = 0
        return maxSum

 同理,最小子數組也可以使用貪心算法,缺點是無法獲取到最小子串,只能獲取其和。

class Solution:
    """
    @param nums: a list of integers
    @return: A integer denote the sum of minimum subarray
    """
    def minSubArray(self, nums):
        # write your code here
        n = len(nums)
        minSum = sum(nums)
        curSum = 0
        for i in range(n):
            # 從i開始求和,如果當前和小於於minSum,則賦值給minSum
            curSum += nums[i]
            if curSum < minSum:
                minSum = curSum
            # 前面的和如果已經大於0了,那么加上下一個元素值,肯定是大於下一個元素值
            # 所以如果前面加起來的值大於0了,則舍棄前面的和,從下一位開始繼續求和
            if curSum > 0:
                curSum = 0
        return minSum


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM