博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode53最大子序和
阅读量:4626 次
发布时间:2019-06-09

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

未经博主同意,禁止瞎JB转载。

LeetCode53最大子序和

https://leetcode-cn.com/problems/maximum-subarray/description/

我的解法:

1 class Solution(object): 2     def maxSubArray(self, nums): 3         """ 4         :type nums: List[int] 5         :rtype: int 6         """ 7         sumer = 0 8         maxer = nums[0] 9         for i in nums:10             sumer += i11             if maxer < 0:12                 maxer = max(maxer,i)13             else:14                 maxer = max(maxer,sumer)15             if sumer<0:16                 sumer = 017         return maxer

 其实11-13行可以删除,变成:

1 class Solution(object): 2     def maxSubArray(self, nums): 3         """ 4         :type nums: List[int] 5         :rtype: int 6         """ 7         sumer = 0 8         maxer = nums[0] 9         for i in nums:10             sumer += i11             maxer = max(maxer,sumer)12             if sumer<0:13                 sumer = 014         return maxer

 更好的解决方案参考:

https://blog.csdn.net/weixin_41958153/article/details/81131379

动态规划:

1 class Solution: 2   3    4     def maxSubArray(self, nums):   5         """  6         :type nums: List[int]  7         :rtype: int  8         """   9         length=len(nums)  10         for i in range(1,length):  11             #当前值的大小与前面的值之和比较,若当前值更大,则取当前值,舍弃前面的值之和  12             subMaxSum=max(nums[i]+nums[i-1],nums[i])  13             nums[i]=subMaxSum#将当前和最大的赋给nums[i],新的nums存储的为和值  14         return max(nums)

分而治之:

1 class Solution(object): 2     def maxSubArray(self, nums): 3         #主函数 4         left = 0 5         #左右边界 6         right = len(nums)-1 7         #求最大和 8         maxSum = self.divide(nums,left,right) 9         return maxSum10         11     def divide(self,nums,left,right):12         #如果只有一个元素就返回13         if left==right:14             return nums[left]15         #确立中心点16         center = (left+right)//217         #求子序在中心点左边的和18         leftMaxSum = self.divide(nums,left,center)19         #求子序在中心点右边的和20         rightMaxSum = self.divide(nums,center+1,right)21         22         #求子序横跨2边的和,分成左边界和和右边界和23         leftBorderSum = nums[center]24         leftSum = nums[center]25         for i in range(center-1,left-1,-1):26             leftSum += nums[i]27             if leftSum>leftBorderSum:28                 #不断更新左区块的最大值29                 leftBorderSum = leftSum30             31         rightBorderSum = nums[center+1]32         rightSum = nums[center+1]33         for i in range(center+2,right+1):34             rightSum += nums[i]35             if rightSum>rightBorderSum:36                 #不断更新右区块的最大值37                 rightBorderSum = rightSum38         #左边界的和 + 右边那块的和39         BorderSum = leftBorderSum + rightBorderSum40         return max(leftMaxSum,rightMaxSum,BorderSum)

 个人认为分治法虽然分治法时间复杂度降到了O(nlogn),但是代码复杂度较高,性价比在实现层面对于小数据集不高。

转载于:https://www.cnblogs.com/kianqunki/p/9763145.html

你可能感兴趣的文章
继承上机作业
查看>>
TSP问题——动态规划
查看>>
java多线程三之线程协作与通信实例
查看>>
japid-controller自动绑定的数据类型
查看>>
vm.max_map_count
查看>>
OSI模型第四层传输层--TCP协议
查看>>
web service 项目 和 普通 web项目 的 区别
查看>>
Linux结构目录
查看>>
ajax frameworks(转贴)
查看>>
javascript禁止修改对象
查看>>
What Are Words(一诺千金)
查看>>
javaScript 工作必知(三) String .的方法从何而来?
查看>>
ubutun:从共享文件夹拷贝文件尽量使用cp命令而不是CTRL+C/V
查看>>
JQUERY动态生成当前年份的前5年以及后 2年
查看>>
MVC3学习 四 EF删除操作
查看>>
IncDec Sequence(codevs 2098)
查看>>
分裂游戏(bzoj 1188)
查看>>
使用 Azure CLI 管理 Azure 虚拟网络和 Linux 虚拟机
查看>>
随机生成6位图片验证码
查看>>
[Win]进程间通信——邮槽Mailslot
查看>>