LeetCode系列之 (JavaScript) => 53. 最大子数组和
题目描述:

leetcode 题目链接: 53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)
解题思路分析:
题干最终的输出是连续子数组的最大和;
1. 贪心算法: 从局部最优中找到全局最优,局部最优就是不以负数开头的子数组最大的和;贪心策略只要目前子数组的和为负数,就从下一个数开始遍历,更新子数组的起始位置。
2. 动态规划: 下一个状态值依赖上一个状态值(详见下面解法的步骤)
不同解法:
/**
* @param {number[]} nums
* @return {number}
*/
/**
* 动态规划 V1
* 动态规划的解题步骤:
* 1.确定DP下标的含义: dp[i]表示以下标i开头的,长度为len的子数组的和
长度为len的和可以根据长度为(len-1)的计算,即在长度为(len-1)的基础上加上nums[i+len-1]
* 2.确定递推公式: 递推公式 dp[i] = dp[i] + dp[i+len-1]
* 3.初始化,下标和dp[i]都为0
* 4.确定遍历方向,从前往后,使用两层遍历:外层遍历是不同的长度,内层遍历是以不同的i开头
* 5.举例推导结果
*/
// !! 超出时间限制,但是思路没有错,示例运算没有问题
var maxSubArray = function(nums) {
var n = nums.length;
var dp = new Array(n);
dp.fill(0); // 以0填充数组
var res = -Infinity;
for(var len = 1; len <= n;len++){
for(var i = 0; i <= n-len; i++){
dp[i]=dp[i]+nums[i+len-1];//不断更新以i开头的子数组的和
if(dp[i] > res){
res = dp[i]; //更新子数组和的最大值
}
}
}
return res;
}
/**
* @param {number[]} nums
* @return {number}
*/
/**
* 动态规划 V2
* 动态规划的解题步骤:
* 1.确定DP下标的含义: dp[i]表示当前下标i之前的最大连续子序列和的最大值
(即所有以i为结尾的数组最大的和)
* 2.确定递推公式: 递推公式 dp[i] = max (dp[i-1]+nums[i],nums[i]) res = max(res,dp[i])
* 3.初始化,下标和dp[i]都为0
* 4.确定遍历方向,从前往后
* 5.举例推导结果
*/
var maxSubArray = function(nums) {
// 题目中没说,可写可不写
if(nums.length == 0){
return '无法进行判断';
}
var dp = new Array(nums.length);
dp[0]=nums[0];
// var res = dp[0];
for(var i = 1; len = nums.length,i<len; i++){
dp[i]= Math.max(dp[i-1]+nums[i],nums[i]); //状态转移公式;不断更新子数组的起始位置
// 更新最大值
// res = Math.max(res,dp[i]);
}
return Math.max(...dp); // 运行速度比较慢
// return res;
};
// 另外一种写法
var maxSubArray = function(nums){
var dp = nums[0]; // 代表当前子数组的和
var res = nums[0];
for(var i = 1; len = nums.length, i<len; i++){
if(dp<0){
dp = nums[i]; //负数总是拉低总和,所以更新起始位置(隐含的一种必要情况是,最终的结果一定是正数开头,如果含有正数)
}else{
dp = dp + nums[i];
}
// 更新max
res = dp>res? dp:res;
}
return res;
}
// 贪心算法
// 解题思路:1.最优解是不是一定在局部最优解里找到;2.选择的贪心策略,举不出来反例
// 只要是子数组之和是负数,就从零开始,因为负数再相加会拉低总和
var maxSubArray = function(nums){
var sum = 0;
var maxSum = -Infinity;
for(var i = 0; i<nums.length; i++){
sum += nums[i]; // 如果sum为0,说明更新了子数组的起始位置
// 更新全局最优
if(sum > maxSum){
maxSum = sum;
}
// 贪心
if(sum < 0){
sum = 0;
}
}
return maxSum;
}
参考链接:
- 代码随想录 (programmercarl.com)
- 代码随想录 (programmercarl.com)(我心中的新晋大神,语言贴地气儿,解法简单易懂)
- 53. Maximum Subarray · leetcode (有些解法,没有采用,可以参考看看~)
LeetCode系列之 (JavaScript) => 53. 最大子数组和的更多相关文章
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 【leetcode算法-简单】53. 最大子序和
[题目描述] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: ...
- LeetCode HOT 100:最大子数组和
题目:53. 最大子数组和 题目描述: 给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和.子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组, ...
- [LeetCode] 53. Maximum Subarray 最大子数组
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [leetcode]53. Maximum Subarray最大子数组和
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- LeetCode 53. 最大子序和(Maximum Subarray)
53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...
- Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)
Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
随机推荐
- kuangbin学习
是有针对性的对于算法的训练 我试试QAQ
- python桌面应用自动化,uiautomation模块的Depth和searchDepth心得
最近在学习yinkaisheng大神写的uiautomation模块,Depth和searchDepth一直使用不好,明明Depth=3,居然可以用searchDepth=1找到,网上也没找到答案,就 ...
- Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复)
Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复) [故障描述]客户设备型号为IBM V7000存储,架构为AIX+oracle+V7000存储阵列柜,需要恢复的数据主要存放在阵 ...
- git 提交本地仓库到远程
提交本地仓库到远程指定仓库 假如已经在远程github创建了项目 在本地创建了和github同样工程并添加了代码,如eclipse创建出工程并写了代码.要把这些代码提交到github git bash ...
- Prettier 与 ESLint 对函数名后空格的处理
问题 Prettier 格式化 JavaScript 代码之后,默认不会在函数与 () 添加空格,而 ESLint 默认情况下则要求函数与 () 之间必须有一个空格. 保留空格的方案配置 方案 1 在 ...
- PyQt5弹框定时关闭(python)
PyQt5使用QMessageBox,可以设置在几秒后关闭 (作者使用的python3) info_box = QMessageBox()# 因为没使用这种方式 QMessageBox.inform ...
- k8s_service
service 功能 主要是提供负载均衡和服务自动发现. pod的ip会随着升降级.销毁的操作改变.客户端不能直接访问pod的ip. service资源被用于在被访问的pod对象中添加一个有着固定IP ...
- ideavimrc 示例
我自己的idea vim配置,用熟悉了以后还真的挺方便的 比较常用的有 ManageRecentProjects,快速切换多个project,经常会遇到同时打开多个project,来回切换方便多了 H ...
- Java 分布式锁实现的一些实践
近期换工作,闲下来有点时间写点东西,在这里分享一些心得体会 背景:我们在做后端开发时,无法避免的会遇到一些一致性问题,有时候我们前端的小伙伴或者rpc接口的调用方,在很短的时间间隔内给我们相同的请求, ...
- highcharts冷门功能总结
1.散点图控制点的样式. Highcharts.chart('container', { series: [{ type: "scatter", marker: { fillCol ...