算法--最大连续子序列和(动态规划,分而治之)
今天在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),虽然可以求出结果但是耗时过长。
算法--最大连续子序列和(动态规划,分而治之)相关推荐
- 最大连续子序列和-动态规划
题目描述: 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序 ...
- 分治算法-01连续子序列的最大和问题
连续子序列的最大和 前言 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的. 首先通过"分" ...
- 最大连续子序列----DP动态规划
1196: 最大连续子序列 时间限制: 1 Sec 内存限制: 128 MB 提交: 44 解决: 20 [提交][状态][讨论版] 题目描述 给定 K 个整数的序列{ N1, N2, ... ...
- HDU 1231 最大连续子序列 (动态规划)
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 54 - 算法 - 动态规划问题 连续子序列和最大
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...
- 动态规划--连续子序列的最大和
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续 ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...
- 动态规划经典题目——最大连续子序列之和
一.题目 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序列 ...
最新文章
- Bengio亲自授课,英国皇家院士参与,这份机器学习在线课别错过丨免费
- 启用无密码方式登录ssh
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008
- C++ 编译器多态与运行时多态
- 用VS Express 2010开发第一个应用程序
- 使用Nomad构建弹性基础架构: 容错和中断恢复
- 优达twitter 清理_云吸狗吸出的啊哈时刻
- bootstrap的依赖_这五款超好用的Bootstrap扩展,让你的Web开发事半功倍
- sqlmap自动扫描注入点_SQLMAP使用指南[学员作品]
- FusionCharts Free(2)
- #166 (Div. 2)
- 想要下载,却没有积分,CSDN你做个人吧
- zoom下载官网android最新,Zoom手机版app下载安装包-Zoom手机版安卓软件下载v5.0-后壳下载...
- Java调用dll文件
- Linux下格式化sd卡和重新分区
- 埃特巴什码(Atbash Cipher)
- pageoffice
- Cesium 实现粒子效果贴地(伪)
- html 如何让网页变灰色
- BC v1.2充电规范
热门文章
- toastr-min.css,Toastr插件提示框使用说明
- SpringBoot-WebMvcAutoConfiguration/WebMvcConfigurer/WebMvcRegistrationsAdapter
- javaweb(10) cookiesession
- 开发文档模板_究竟什么样的开发流程是规范的?
- python程序设计教程上海交通大学_上海交通大学 python程序设计课程PPT Ch2.ppt
- Android界面性能优化最全总结、原理剖析
- RocketMQ-0.1
- 13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
- 使用C#读取XML节点,修改XML节点