今天在LeetCode上遇到一个求最大连续子序列和的问题,如下:
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: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

先上正确答案,用动态规划处理这个问题。

首先介绍一下什么是动态规划,简单来说就是:
把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。

分析一下这个问题:

设数组为a,第一个值为a[0],第二个值为a[1],以此类推,第n个值为a[n]。
设以a[i]为子序列最后一项时,连续最大子序和为F(i)。
注意:这里只指定a[i]作为最后一项,并不指定开始项,也就是说这里的F(i)是以a[i]前任意项开始,a[i]项结尾的连续整数和。

  • 当该数组中只有一个数值a[0]时,F(0) = a[0]。
  • 当该数组中有多个数值时,F(i) = max { a[i], a[i] + F(i-1) }。

写两个值看看这个方程:
F(0) = a[0]
F(1) = max{ a[1], a[1] + F(0) } = max{ a[1], a[0] + a[1] }
F(2) = max{ a[2], a[2] + F(1) } = max{ a[2], a[0] + a[1] + a[2] } 或= max{ a[2], a[1] + a[2] }
以此类推。

接下来写代码:

/*** @param {number[]} nums* @return {number}*/
var maxSubArray = function(nums) {let max = nums[0];let len = nums.length;if (len === 1) {return max;} else {let sum = 0;for (let i = 0; i < len; i ++) {sum += nums[i];if (sum < nums[i]) {sum = nums[i];}if (max < sum) {max = sum;}}}return max;
};

只要思路对了,写代码是再容易不过的事情啦!

补充分而治之法(递归)求解,以下为js代码:

/*** @param {number[]} nums* @param {number} left 左端开始位置* @param {number} right 右端结束位置* @return {number}*/
maxSubArray (nums, left, right) {if (left === right) {return nums[0]}let mid = Math.floor((left + right) / 2)// 求左侧最大值let leftMax = this.maxSubArray(nums, left, mid)// 求右侧最大值let rightMax = this.maxSubArray(nums, mid + 1, right)let sum = 0let lmax = nums[mid]let rmax = nums[mid + 1]// 从中线往左遍历,取最大值for (let i = mid; i >= left; i--) {sum += nums[i]if (sum > lmax) {lmax = sum}}sum = 0// 从中线往右遍历,取最大值for (let i = mid + 1; i <= right; i++) {sum += nums[i]if (sum > rmax) {rmax = sum}}let midMax = lmax + rmaxreturn leftMax > rightMax ? leftMax > midMax ? leftMax : midMax : rightMax > midMax ? rightMax : midMax}// 调用
maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4], 1, 9)

=============================================
补充记录自己最开始的复杂写法:

/*** @param {number[]} nums* @return {number}*/
var maxSubArray = function(nums) {var arr = [];for (let i = 0; i < nums.length; i ++) {let sum = nums[i];for (let j = i + 1; j < nums.length; j ++) {sum += nums[j];arr.push(sum);}}arr.sort(function(a,b){ return a-b; }); return arr[arr.length - 1];
};

我去,这是什么垃圾?把所有值都丢到一个新数组中这种智障代码真的是我写的?这样数组一大的话,arr数组将耗费巨大的内存,果不其然,提交后显示堆内存不足。

好吧,优化一下代码,如下:

/*** @param {number[]} nums* @return {number}*/
var maxSubArray = function(nums) {var max = nums[0];var len = nums.length;for (let i = 0; i < len; i ++) {let sum = nums[i];for (let j = i + 1; j < len; j ++) {max = max > sum ? max : sum;sum += nums[j];}max = max > sum ? max : sum;}return max;
};

这里取消了新数组,但是此时的算法时间复杂度是O(n^2),虽然可以求出结果但是耗时过长。

算法--最大连续子序列和(动态规划,分而治之)相关推荐

  1. 最大连续子序列和-动态规划

    题目描述: 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序 ...

  2. 分治算法-01连续子序列的最大和问题

    连续子序列的最大和 前言 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的. 首先通过"分" ...

  3. 最大连续子序列----DP动态规划

    1196: 最大连续子序列 时间限制: 1 Sec  内存限制: 128 MB 提交: 44  解决: 20 [提交][状态][讨论版] 题目描述 给定 K 个整数的序列{ N1,  N2,  ... ...

  4. HDU 1231 最大连续子序列 (动态规划)

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. 54 - 算法 - 动态规划问题 连续子序列和最大

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...

  6. 动态规划--连续子序列的最大和

    给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续 ...

  7. 算法知识之最长公共子序列问题(动态规划)

    最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...

  8. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  9. 动态规划经典题目——最大连续子序列之和

    一.题目 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序列 ...

最新文章

  1. Bengio亲自授课,英国皇家院士参与,这份机器学习在线课别错过丨免费
  2. 启用无密码方式登录ssh
  3. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008
  4. C++ 编译器多态与运行时多态
  5. 用VS Express 2010开发第一个应用程序
  6. 使用Nomad构建弹性基础架构: 容错和中断恢复
  7. 优达twitter 清理_云吸狗吸出的啊哈时刻
  8. bootstrap的依赖_这五款超好用的Bootstrap扩展,让你的Web开发事半功倍
  9. sqlmap自动扫描注入点_SQLMAP使用指南[学员作品]
  10. FusionCharts Free(2)
  11. #166 (Div. 2)
  12. 想要下载,却没有积分,CSDN你做个人吧
  13. zoom下载官网android最新,Zoom手机版app下载安装包-Zoom手机版安卓软件下载v5.0-后壳下载...
  14. Java调用dll文件
  15. Linux下格式化sd卡和重新分区
  16. 埃特巴什码(Atbash Cipher)
  17. pageoffice
  18. Cesium 实现粒子效果贴地(伪)
  19. html 如何让网页变灰色
  20. BC v1.2充电规范

热门文章

  1. toastr-min.css,Toastr插件提示框使用说明
  2. SpringBoot-WebMvcAutoConfiguration/WebMvcConfigurer/WebMvcRegistrationsAdapter
  3. javaweb(10) cookiesession
  4. 开发文档模板_究竟什么样的开发流程是规范的?
  5. python程序设计教程上海交通大学_上海交通大学 python程序设计课程PPT Ch2.ppt
  6. Android界面性能优化最全总结、原理剖析
  7. RocketMQ-0.1
  8. 13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
  9. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
  10. 使用C#读取XML节点,修改XML节点