給定乙個整數陣列,找出總和最大的連續數列,並返回總和。
輸入: [-2,1,-3,4,-1,2,1,-5,4]輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
class
solution
:def
maxsubarray
(self, nums)
: n =
len(nums)
dp =
[num for num in nums]
for i in
range(1
, n)
:if nums[i]
>=0:
dp[i]
= dp[i -1]
+ nums[i]
else
: dp[i]
= nums[i]
return
max(dp)
遞迴計算左半部分的最大連續和,最右部分的最大連續和以及中間部分的最大連續和,結果為其中的最大者。
class
solution
:def
maxsubarray
(self, nums)
:def
divide
(nums, left, right)
:if left == right:
return nums[left]
mid = left +
(right - left)//2
# 左半部分的最大和
sum_left = divide(nums, left, mid)
# 右半部分的最大和
sum_right = divide(nums, mid +
1, right)
# 求中間部分的最大和
# 先求中間偏左部分的最大和
left_sum, max_left_sum =0,
-99999
for i in
range
(mid, left -1,
-1):
left_sum += nums[i]
max_left_sum =
max(left_sum, max_left_sum)
# 再求中間偏右部分的最大和
right_sum, max_right_sum =0,
-99999
for i in
range
(mid +
1, right +1)
: right_sum += nums[i]
max_right_sum =
max(right_sum, max_right_sum)
return
max(sum_left, sum_right, max_left_sum + max_right_sum)
ifnot nums or
len(nums)==0
:return
0return divide(nums,0,
len(nums)-1
)
leetcode 面試題專題
面試題51.陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。利用歸併排序,將陣列分成兩部分,前面一部分和後面一部分,進行歸併的時候,需要比較兩個陣列的數值大小,如果第二個陣列的值小的話,代表前乙個陣列剩下的都...
位元組面試題 leetcode
給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...
leetcode面試題 08 11 硬幣
硬幣。給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總金額...