时间:2020-5-13
题目地址:https://leetcode-cn.com/problems/maximum-subarray/
题目难度:Easy
题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思路1:暴力破解法
代码段1:超出时间限制
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result = nums[0]
for i in range(0, len(nums), 1):
temp = 0
for j in range(i, len(nums), 1):
temp += nums[j]
if(temp > result):
result = temp
return result
总结:
- leetcode太优秀,竟然200+个测试用例,只有一个考察时间复杂度的没通过
- 我这暴力破解法绝对足够暴力,= =。
思路2:前缀和+暴力破解法
代码段2:超出时间限制
import sys
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
maxSum = -sys.maxsize
sum = 0
for i in range(n):
sum = 0
for j in range(i, n):
sum += nums[j]
maxSum = max(maxSum, sum)
return maxSum
总结:github上给出的思路,为啥大神能ac,我没有,没继续整
参见:https://github.com/azl397985856/leetcode/blob/master/problems/53.maximum-sum-subarray-cn.md
思路3:每次遍历都能算出sum(i) (i = 0,1,2...,n-1),最大值就是sum(i) - 最小的sum(k)(k = 0,1,...i-1)
代码段3:执行通过
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
maxSum = nums[0]
minSum = 0
temp = 0
for i in range(0, len(nums)):
temp += nums[i]
maxSum = max(temp - minSum, maxSum)
minSum = min(temp, minSum)
return maxSum
总结:
- 暴力法的时间复杂度O(n^3),空间复杂度O(1),此解法很巧妙,时间复杂度O(n),空间复杂度O(1),n为数组长度
- 脑子很重要
后期优化:
1、分治法
2、动态规划