题目描述:

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;
}

参考链接:

LeetCode系列之 (JavaScript) => 53. 最大子数组和的更多相关文章

  1. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. 【leetcode算法-简单】53. 最大子序和

    [题目描述] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:  ...

  3. LeetCode HOT 100:最大子数组和

    题目:53. 最大子数组和 题目描述: 给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和.子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组, ...

  4. [LeetCode] 53. Maximum Subarray 最大子数组

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  5. [leetcode]53. Maximum Subarray最大子数组和

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  6. [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  7. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. LeetCode 53. 最大子序和(Maximum Subarray)

    53. 最大子序和 53. Maximum Subarray 题目描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode53. M ...

  9. Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)

    Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...

  10. [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 ...

随机推荐

  1. 808.11ac的MAC层

    MAC层是802.11的主要功能部分.上层应用通过调用MAC层提供的接口原语调用MAC层的功能. 在内部,MAC由除了函数还有数据,叫MIB,存储MAC的各种参数.SME是一个单独的模块,用来跟接口函 ...

  2. Nginx/1.13.3热升级1.21.6

    背景: 根据其服务器响应标头,安装的 nginx 版本为低于 1.16.1 的 1.9.5,或是低于 1.17.3 的 1.17.x.因此,它受到多种拒绝服务漏洞的影响: - HTTP/2 协议堆栈中 ...

  3. dart+flutter中使用PaginatedDataTable分页时最后一页多出空白行问题

    使用PaginatedDataTable时解决最后一页不够当前行的话会有很空白行的问题 解决的场景: 比如下图,28行数据,每页5行最后一页会多出两行空白. 解决方法: 可以使用PaginatedDa ...

  4. (0403)位运算符+interface

    1)interface 2)位运算符

  5. Kafka -- 基本操作

    kafka 环境的安装 docker run -d --name zookeeper_zh --restart always --network kafka-net -e ALLOW_ANONYMOU ...

  6. 使用viper读取配置文件

    配置文件config.yml mysql: type: mysql dsn: "user:pass@tcp(localhost:30306)/db_name?charset=utf8& ...

  7. mysql企业常用集群架构

    转自 https://blog.csdn.net/kingice1014/article/details/76020061 1.mysql企业常用集群架构 在中小型互联网的企业中.mysql的集群一般 ...

  8. c# reflect里面的getValue()参数

    Type ty = t.GetType(); PropertyInfo[] PropertyInfo = ty.GetProperties(); string Typename = typeof(T) ...

  9. twenty two

    打包处理less文件 1,运行npm i less-loader@10.0.1 less@4.1.1 -D 2, 在webpack.config.js的module->rules数组中 rule ...

  10. SQL中各种join的区别

    INNER JOIN 在表中存在至少一个匹配时,INNER JOIN 关键字返回行 返回的是一个交集 内连接就是等值连接 自然连接(outer join. left join, right join) ...