我的博客

leetcode 53 最大子序和 python

目录
  1. 解法
    1. O(n) 解法
    2. 分治解法O(nlogn)

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

O(n) 解法

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
s = 0
ans = nums[0]
for num in nums:
if s > 0:
s += num
else:
s = num
ans = max(ans, s)
return ans

分治解法O(nlogn)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if len(nums) == 1: return nums[0]
mid = len(nums) >> 1
left_ans = self.maxSubArray(nums[:mid])
right_ans = self.maxSubArray(nums[mid:])
mid_ans = nums[mid]
tmp = 0
tmp_max = 0
for i in range(mid-1, -1, -1):
tmp += nums[i]
tmp_max = max(tmp_max, tmp)
mid_ans += tmp_max
tmp_max = 0
tmp = 0
for i in range(mid+1, len(nums)):
tmp += nums[i]
tmp_max = max(tmp_max, tmp)
mid_ans += tmp_max
return max(left_ans, mid_ans, right_ans)

评论无需登录,可以匿名,欢迎评论!