題目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
