leetcode-Maximum Subarray
https://leetcode.com/problems/maximum-subarray/
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
.
这道题的题意是要我们找到一个子串,这个子串的和是所有子串里面最大的。返回子串的和。
我当时最大的失误就是把题意看成为了返回当前子串的头下标。。(题目说找到子串,find xx array 但却又返回的是一个数字,确实让我的智商捏了一把汗。。)看题目太粗心,以后这个细节一定要注意。
解题思路:
首先,我们发现这道题目的标签是为动态规划,那么动态规划的简单思想就是把一道问题分成小的阶段,我们只要求出当前阶段最优的结果,一步一步就可以解得正确地答案。
所以当前我们需要找到和为最大的子串,怎样才能把它分成几段呢?是分成以不同下标开头的子串分别计算呢还是怎么样?如何想明白这里,确实需要一定的数学素养,像我就没有想出来。。既然我现在已经知道解题思路了,我还是争取以最自然的方法把解题的思路慢慢道来,不让读者觉得很突兀。
既然题目已经标明这个问题是可以动态规划的方法来进行解决了,而我们一时却又想不出个解题的方法,想必我们可以好好的去看看动态规划的具体定义,看从中能不能得到什么启发,下面这一段摘自百度百科动态规划的定义:
20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
这一句道出动态规划的基本思想,不过貌似对现在没找到解题方案的我们并没有什么帮助。继续往下看:
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
这里我们发现他提到了对于静态规划,时间因素往往可能是不存在的,需要我们人为的引入,那么就我们当前的这个题目来讲是不是有点类似呢?
当前我们可以把我们自己的题目写成这样一种形式:MaxSubarray(list),乍一看这哪里有什么时间因素呢?哪来的阶段呢?人为添加时间因素怎么加?我们可不可以先这样试试:MaxSubarray(list, time),看起是有点怪怪的,不过改一下会不会看得习惯一些?MaxSubarray(list , i),诶。这里面的i是不是给了我们无限的遐想?i可以是什么呢?
如果我们现在将函数假设成了上述的样子,我们就可以让time从小变到大,最终能解得我们所需要的答案。什么东西可以从小变到大呢,如果我想成每个不同下标所打头的子序列可不可以,这样好像变成了一种迭代方法,而不是动态规划,而且他们相互之间似乎并没有状态的联系。不知道到这里大家有没有想到,如果time是指我们给定列表的长度会怎样,我们先求出短列表中和和最大子序列,然后再给列表添加一个元素,然后再求它当前的和最大子序列。
如果当前列表的最大子序列已经找到,那么我们添加一个元素后其最大子列表应该有三种情况,一种是维持原状,仍然是之前的最大子序列;一种是添加的元素够大,一枝独秀,直接就是长度为1的她自己;最后一种情况可能大家不太好想,就是包含之前最大子序列还有之后的元素直到新添加元素为止,这样一个子序列。
针对第三种情况简单描述一下: [当前最大子序列],[最大子序列后面的元素],[新加入的元素]
+ - +
我们可以知道,【最大子序列后面的元素】+【当前最大子序列】<【当前最大子序列】,也就是说【最大子序列后面的元素】<0;如果新加入的元素为正的话,那么【最大子序列后面的元素】 = 【最大子序列后面的元素】+【新加入的元素】这个结果不一定小于零,也就是说,新加入元素后的最大子序列将变为【当前最大子序列】+【最大子序列后面的元素】+【新加入的元素】。
好了这样一来,我们就可以上代码了!python祭上:
class Solution:
# @param {integer[]} nums
# @return {integer}
def maxSubArray(self, nums):
sofar = nums[0]
newend = nums[0]
for i in range(1,len(nums)):
newend = max(nums[i], newend+nums[i])
sofar = max(sofar, newend)
return sofar
最后贴上百度百科动态规划的另一段话:
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
共勉
leetcode-Maximum Subarray的更多相关文章
- [array] leetcode - 53. Maximum Subarray - Easy
leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- LeetCode 53. Maximum Subarray(最大的子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 【leetcode】Maximum Subarray (53)
1. Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ...
- 【leetcode】Maximum Subarray
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) whic ...
- 41. leetcode 53. Maximum Subarray
53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...
- Leetcode#53.Maximum Subarray(最大子序和)
题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...
- LN : leetcode 53 Maximum Subarray
lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...
随机推荐
- Dubbo初探
Dubbo是什么? 1.阿里巴巴开源项目.2.Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. ps: SOA(面相服务的体系结构) RPC( ...
- poolboy的坑
poolboy是Erlang中运用非常广泛的进程池库,它有很多优点,使用简单,在很多项目中都能看到它的身影.不过,它也有一些坑,使用时候需要注意.(本文对poolboy的分析基于1.5.1版本) wo ...
- 打印机问题win7 和xp
服务器端问题,重启如下服务 net stop "print spooler" net start "print spooler" gpedit.msc 本地计算 ...
- redis3.0 集群实战2 - 集群功能实战
1 集群基本操作 1.1 查看当前集群状态 使用redis-trib.rb check功能查看对应的节点的状态: [root@bogon bin]# ./redis-trib.rb check 1 ...
- NYOJ 42 一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- 【GOF23设计模式】中介者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...
- 开启Windows Server 2008 R2上帝模式
TAG标签: 摘要:这个“God Mode” 应该大部分的网友都听过了,只是在 Windows Server 2008 R2 上也支持此一功能.启用方式非常简单,在桌面新建一个文件夹,命名为: God ...
- Mssql链接mysql数据库
最近在做mysql数据库实时同步到mssql数据库的方案,花了一周时间,测试通过了,在实际机器上测试出现了若干问题.第一个问题就是在mssql上链接mysql的问题. 第一步,安装 Mysql ODB ...
- ArcGIS Add-in——自动保存编辑
需求:由于初次使用ArcGIS编辑器不习惯.数据量大造成经常程序未响应.计算机断电等因素,造成编辑的数据没有保存,影响了生产效率,本人根据草色静然的博文,总结了自动保存编辑的实现方法. 分析:自动保存 ...
- 参加2013中国大数据技术大会(BDTC2013)
2013年12月5日-6日参加了为期两天的2013中国大数据技术大会(Big Data Technology Conference, BDTC2013),本期会议主题是:“应用驱动的架构与技术 ”.大 ...