题目描述:

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. Linux 第六节( 磁盘系统,挂载,分区,格式化)

    /dev/st0   磁带机 /dev/lp     打印机 /dev/cdrom  光驱 /dev/sd       scsi接口硬盘 sata接口硬盘  U盘(sda,sdb,sdc   分别对应 ...

  2. sxt_(001_003)_spring_ioc

    一.spring简介 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架.Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可 ...

  3. VUE3+VITE 常见问题解决

    reactive解构最深的一层,失去响应性问题 pinia创建的store,使用结构失去响应性 reactive包裹后的对象 重新赋值失去响应性 无法动态引入图片 在computed中传参数 vue3 ...

  4. django中读取settings中的相关参数

    from django.conf import settings print(settings.IP_LOCAL)

  5. etcd 入门

    服务注册与服务发现 三部分的作用: 注册中心:记录服务和服务地址的映射关系 服务提供者:将服务注册到服务中心 服务发现者:对服务中心的服务进行调用 简单易懂的 raft 算法 Raft算法是一个一致性 ...

  6. 阻塞I/O,非阻塞I/O,同步I/O,异步I/O

    根据应用程序是否阻塞自身运行分为: 阻塞I/O:是指应用程序在执行I/O操作后,如果没有获得响应,          就会阻塞当前线程,不能执行其他任务. 非阻塞I/O:是指应用程序在执行I/O操作后 ...

  7. PyTorch Live get started from Windows

    〇. PyTorch Live https://pytorch.org/live/docs/tutorials/get-started-manually/ 以下 命令 建议都用 以管理员身份运行的 P ...

  8. 使用FormData上传图片

    document.querySelector('.file').addEventListener('change', function(e) { //1.可以通过this拿到这个file的DOM元素 ...

  9. AUTOCAD——半径标注命令

    创建圆或圆弧的半径标注. 执行方式 命令行:DIMRADLUS 菜单栏:标注→半径标注 工具栏:半径标注图标 "半径标注操作命令位置"界面 执行以上命令后,命令行会显示以下信息: ...

  10. the origin of month name in English

    序号 月份 简述 详述 1 January Janus神 罗马神话的神Janus,双面,门神 2 February Februa节 古罗马人都要杀牲饮酒,欢庆菲勃卢姆节(Februarius).忏悔自 ...