給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。(乙個也不會,難受)
class solution(object):
def maxsubarray1(self, nums):
""":type nums: list[int]
:rtype: int
"""return self.max_sub(0, len(nums) - 1, nums)[-1]
def max_sub(self, start, end, nums):
if start == end:
return nums[start], nums[start], nums[start], nums[start]
mid = (start + end) >> 1
left_left_sum, left_right_sum, left_all_sum, left_mid_sum = self.max_sub(start, mid, nums)
right_left_sum, right_right_sum, right_all_sum, right_mid_sum = self.max_sub(mid + 1, end, nums)
return max(left_left_sum, left_all_sum + right_left_sum), \
max(right_right_sum, right_all_sum + left_right_sum), \
left_all_sum + right_all_sum, \
max(left_right_sum + right_left_sum, max(left_mid_sum, right_mid_sum))
def maxsubarray2(self, nums):
""":type nums: list[int]
:rtype: int
"""# pre, max_ans = 0, nums[0]
pre = 0
max_ans = nums[0]
for item in nums:
# pre記錄是當前值和前n個連續值的最大值;當前n個連續值,小於當前值時直接將pre指向當前值
# 也就是前n個連續數不存在最大連續陣列,直接拋棄前n項,從n+1項繼續記錄
pre = max(pre + item, item)
# max_ans一直記錄的是連續子項的最大值
max_ans = max(max_ans, pre)
return max_ans
def maxsubarray3(self, nums):
""":type nums: list[int]
:rtype: int
"""return self.get_info(nums, 0, len(nums) - 1).m_sum
def get_info(self, nums, left, right):
if left == right:
return status(nums[left], nums[left], nums[left], nums[left])
mid = (left + right) >> 1
l_sub = self.get_info(nums, left, mid)
r_sub = self.get_info(nums, mid+1, right)
return self.push_up(l_sub, r_sub)
def push_up(self, l, r):
i_sum = l.i_sum + r.i_sum
l_sum = max(l.l_sum, l.i_sum + r.l_sum)
r_sum = max(r.r_sum, r.i_sum + l.r_sum)
m_sum = max(max(l.m_sum, r.m_sum), l.r_sum + r.l_sum)
return status(l_sum, r_sum, m_sum, i_sum)
def maxsubarray4(self, nums):
""":type nums: list[int]
:rtype: int
"""if len(nums) == 0:
return 0
if len(nums) == 1:
return nums[0]
tmp_list =
max_sum = nums[0]
while nums:
if sum(tmp_list) > max_sum:
max_sum = sum(tmp_list)
if sum(tmp_list) < 0:
tmp_list =
return max_sum
def maxsubarray5(self, nums):
"""最原始的dp方式
:type nums: list[int]
:rtype: int
"""length = len(nums)
dp = [0 for _ in range(length)]
dp[0] = nums[0]
max_value = dp[0]
for i in range(length):
dp[i] = max(dp[i-1] + nums[i], nums[i])
max_value = max(max_value, dp[i])
return max_value
def maxsubarray(self, nums):
"""暴力遞迴,算出每個未知的最大值
:type nums: list[int]
:rtype: int
"""max_value = float("-inf")
length = len(nums)
for i in range(length):
sum_ = 0
for j in range(i, length):
sum_ += nums[j]
max_value = max(max_value, sum_)
return max_value
class status:
def __init__(self, l_sum, r_sum, m_sum, i_sum):
self.l_sum = l_sum
self.r_sum = r_sum
self.m_sum = m_sum
self.i_sum = i_sum
if __name__ == '__main__':
s1 = solution()
s = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(s1.maxsubarray1(s))
最大子序和
演算法一 對這個問題,有乙個相對複雜的 o nlogn 的解法,就是使用遞迴。如果要是求出序列的位置的話,這將是最好的演算法了 因為我們後面還會有個 o n 的演算法,但是不能求出最大子串行的位置 該方法我們採用 分治策略 divide and conquer 在我們例子中,最大子串行可能在三個地方...
最大子序和
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。方法一 雙指標窮舉法 思路 要找到最大和的連續陣列,那麼就將所有可能的和都拿到,取到最大的即...
最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。分析 1.暴力遍歷...