经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
53. Maximum Subarray
来源:cnblogs  作者:PilgrimHui  时间:2018/10/8 8:49:51  对本文有异议

问题

找出数组nums中的一个连续子数组,它们的和最大。

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

思路

用dp[i]表示以index i结尾的连续子数组的最大和。这个值取决于dp[i-1]和nums[i],如果dp[i-1]+nums[i]的值要大于dp[i-1],就继续沿用dp[i-1]中选择的子数组继续延伸,否则就以nums[i]开头定义新的子数组。

dp公式为:\(dp[i] = max(nums[i], dp[i-1] + nums[i])\)。最后对dp数组取最大的数即可。

因为dp只取决于前一个数,可以优化,省去dp的数组空间开销。

时间复杂度O(n),空间复杂度O(1)

代码

  1. class Solution(object):
  2. def maxSubArray(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. maxSum = dp = nums[0]
  8. for i in range(1,len(nums)):
  9. dp = max(nums[i], dp+nums[i])
  10. if(dp>maxSum):
  11. maxSum = dp
  12. return maxSum
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号