LeetCode#53 Maximum Subarray
Problem Difinition:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
Solution:
1)动态规划.
输入数组为nums,用 a[i] 表示nums[0...i]这部分元素的子序列(此子序列以元素nums[i]结尾,不管它以谁开头)能得到的最大累加和。则有递推关系:
a[ i ] =nums[ i ]+ ( a[i-1] if a[i-1]>0 else 0)
求解过程就是迭代整个数组,求最大的a[ i ]。可以用一个数组来保存所有的a[ i ],空间复杂度O(n)。
然而实际上不需要一个数组来存放所有的a[ i ],而用一个变量代替。
1 # @param {integer[]} nums 2 # @return {integer} 3 def maxSubArray(nums): 4 5 maxSum=-sys.maxint 6 sm=0 7 begin=0 8 end=0 9 maxBegin=0 10 maxEnd=0 11 for i, n in enumerate(nums): 12 sm+=n 13 if sm>maxSum: 14 maxSum=sm 15 maxBegin=begin 16 maxEnd=end 17 if sm<=0: 18 begin=i+1 19 end=i+1 20 sm=0 21 else: 22 end+=1 23 return nums[maxBegin: maxEnd+1]
以上算法会求出得到最大和的完整子序列,更通用,思路也表达得比较清晰。然而题目的要求只是求出这个最大和,所以可以精简很多:
1 # @param {integer[]} nums 2 # @return {integer} 3 def maxSubArray(nums): 4 maxSum=-sys.maxint 5 sm=0 6 for n in nums: 7 sm+=n 8 maxSum=max(maxSum, sm) 9 sm=max(sm, 0) 10 return maxSum
实际上想法很简单,逐一累加元素,一旦和不大于0,则从下一个位置开始,重新累加,并在这个过程中不断更新最大和。
2)分治。
基本思想:
1._分。把数组切成左右两部分,那么给出最大累加和的子序列,要么全在左边,要么全在右边,要么就横跨左右两边(子序列包含了中间元素)
2._合。整个数组的最大累加和就是max(左边的最大和, 右边的最大和, 跨越两边的最大和)
于是可以:a.先分别求左右两个部分的最大累加和,这是一个递归的过程;
b.求跨越左右两边的子序列能够给出的最大累加和;
c.返回三个和中的最大值,作为整个序列的最大累加和。
关键是b.过程。其实也很简单,以中间元素为起点,分别向左右两边扩展,求出在左边子序列中,后缀序列能达到的最大累加和;以及
右边序列中,前缀序列能达到的最大累加和,这俩累加和加起来即可。
设中间节点的下标为m,那所谓的左边子序列的后缀就是:nums[...m-2, m-1, m],右边子序列的前缀就是nums[m+1, m+2...].
1 # @param {integer[]} nums 2 # @return {integer} 3 def maxSubArray(self, nums): 4 if len(nums)==0: 5 return 0 6 return self.recur(nums, 0, len(nums)-1) 7 8 9 def recur(self, nums, start, end): 10 if start==end: #one element 11 return nums[start] 12 mid=(start+end)/2 13 leftAns=self.recur(nums, start, mid) 14 rightAns=self.recur(nums, mid+1, end) 15 leftMax=nums[mid] 16 rightMax=nums[mid+1] 17 tmp=0 18 for i in range(mid, start-1, -1): #直接加到最后吧 19 tmp+=nums[i] 20 leftMax=max(leftMax, tmp) 21 tmp=0 22 for i in range(mid+1, end+1): 23 tmp+=nums[i] 24 rightMax=max(rightMax, tmp) 25 return max(leftAns, rightAns, leftMax+rightMax)
转载于:https://www.cnblogs.com/acetseng/p/4703378.html
LeetCode#53 Maximum Subarray相关推荐
- 【DP】LeetCode 53. Maximum Subarray
LeetCode 53. Maximum Subarray Solution1:我的答案 动态规划 class Solution { public:int maxSubArray(vector< ...
- 【动态规划】LeetCode 53. Maximum Subarray
LeetCode 53. Maximum Subarray 原题描述(求子序列最大和/最大子串):Find the contiguous subarray within an array (conta ...
- [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray
41. Maximum Subarray/53. Maximum Subarray 本题难度: Eas Topic: Dynamic Programming Description Given an ...
- LeetCode(53):Maximum Subarray
Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...
- [LeetCode]: 53: Maximum Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- leetCode 53. maximum subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- C#解leetcode 53.Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 53.Maximum Subarray
/** 53.Maximum Subarray * 2016-5-7 by Mingyang * 如果我们从头遍历这个数组.对于数组中的其中一个元素,它只有两个选择: 1.* 要么加入之前的数组加和之 ...
- LeetCode 53. Maximum Subarray--动态规划--C++,Python解法
题目地址:Maximum Subarray - LeetCode Given an integer array nums, find the contiguous subarray (containi ...
最新文章
- threejs加载模型挤压变形_【技研】挤压铸造铝合金转向节开发
- 计算机中丢失qt5svg,无法找到“Qt5Svg”提供了一个程序包配置文件
- Uva 11922 Splay
- 截取url的host_java正则表达式获取url的host示例
- P3357 最长k可重线段集问题 网络流
- React开发(158):ant design级联回显 直接传入数组
- UI upload多文件上传
- JVM参数这样配置会让你的程序更快更强
- 【实践】因果推断在快手推荐场景的应用探索.pdf(附下载链接)
- 第二课--C语言基础(1,2部分--共三部分)
- Fundebug后端Java异常监控插件更新至0.3.1,修复Maven下载失败的问题
- (1)快速了解Redis
- 国军标要求的产品“六性”到底是什么?
- 一號倉:《漫》--《3D》
- win7定时关机命令_WIN7系统还有用吗?怎么随时切换WIN7/10?
- 中央财经大学c语言试题答案,中央财经大学C语言题
- 计算两个向量的逆时针夹角
- 全程无尿点,死磕前端~
- 网页设计排版中哪些元素最重要?
- 【程序员入门记录】ThinkPad E470改造记录——系统改造
热门文章
- GDI+ 学习记录(31) 图像颜色变换(TGPImageAttributes)
- 格灵深瞳开源全球最大最干净的人脸识别数据集:Glint360K
- 文本识别新王者CharNet:卷积字符网络
- 快准狠!Intel论文揭示自家车牌识别算法:LPRNet
- 检测与跟踪:快速视频姿态估计
- linux xchgl 汇编含义,替换x86 xchgl 汇编指令
- mysql重做日志与binlog日志区别_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...
- 【机器学习】机器学习从零到掌握之三 -- 教你使用K近邻算法改进约会网站
- 【TensorFlow】TensorFlow函数精讲之tf.constant()
- 霸榜!Google发布语义分割新数据集!