題目1 最小子數組
描述:
給定一個整數數組,找到一個具有最小和的子數組。返回其最小和。
注意事項
子數組最少包含一個數字
您在真實的面試中是否遇到過這個題?
Yes
樣例
給出數組[1, -1, -2, 1],返回 -3
標簽
題目2 最大子數組
描述:
給定一個整數數組,找到一個具有最大和的子數組,返回其最大和。
注意事項
子數組最少包含一個數
您在真實的面試中是否遇到過這個題?
Yes
樣例
給出數組[−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