博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 53. Maximum Subarray 解法 python
阅读量:2500 次
发布时间:2019-05-11

本文共 1386 字,大约阅读时间需要 4 分钟。

一.问题描述

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],Output: 6Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

二.解决思路

方法一:

首先建立一个新数组sumA

sumA[i]=a[0]+a[1]+...a[i-1]+a[i]=sumA[i-1]+nums[i]

然后一个子数组和最大相当于求max(sumA[i]-sumA[j], sumA[i])  i>j

如果sumA[j]是大于0的,我们就不用减去它

方法二:

考虑一下什么情况下会子数组最大和会从一个子数组变成另一个子数组

假设一开始的最大子数组是x1到y1

之后变成了x2到y2

分析可得知,这种变化只可能是x1到x2的和小于等于0的时候才成立(可以用反证法证明,很容易)

如果x1到x2的和不<0,那么x1到y2的和大于x2到y2的和

因此我们只需要迭代,当sum<0的时候,重新记录sum,用res记录最大

 

题目描述有提到用更高效的分治算法,后面看到会更新

更多leetcode算法题解法请关注我的专栏或关注我

欢迎大家一起套路一起刷题一起ac

三.源码

#method1class Solution:    def maxSubArray(self, nums: List[int]) -> int:        if len(nums)==1:return nums[0]        sumA=[]        sumA.append(nums[0])        max_sum,min_sum,rt=nums[0],nums[0],nums[0]        for i in range(1,len(nums)):            sumA.append(sumA[i-1]+nums[i])            rt=max(rt,sumA[i],sumA[i]-min_sum)            if sumA[i]
#method2class Solution:    def maxSubArray(self, nums: List[int]) -> int:        rt=nums[0]        sum_num=0        for num in nums:            if sum_num>=0:sum_num+=num            else:sum_num=num            rt=max(rt,sum_num)        return rt

 

转载地址:http://eqmrb.baihongyu.com/

你可能感兴趣的文章
vnpy学习_04回测评价指标的缺陷
查看>>
ubuntu终端一次多条命令方法和区别
查看>>
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>
设计模式06_原型
查看>>
设计模式07_建造者
查看>>
设计模式08_适配器
查看>>
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>
设计模式12_外观模式
查看>>
设计模式13_享元模式
查看>>
设计模式14_组合结构
查看>>
设计模式15_模板
查看>>
海龟交易法则01_玩风险的交易者
查看>>
CTA策略02_boll
查看>>