feat: 添加kadane相关算法53,918

This commit is contained in:
LouisFonda 2025-06-22 00:29:25 +08:00
parent 2e1ef51465
commit 09c5a746f1
Signed by: yigencong
GPG Key ID: 29CE877CED00E966
2 changed files with 59 additions and 0 deletions

View File

@ -0,0 +1,24 @@
/**
* @param {number[]} nums
* @return {number}
*/
const maxSubArray = function (nums) {
return f1(nums);
};
/*
定义dp[i]表示以nums[i]结尾的最大子数组和那么dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]),要么是前面最大的子数组
加上自己要么是自己本身
*/
function f1(nums) {
let max = nums[0];
const dp = new Array(nums.length).fill(0);
dp[0] = nums[0];
for (let i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
max = Math.max(max, dp[i]);
}
return max;
}

View File

@ -0,0 +1,35 @@
/**
* @param {number[]} nums
* @return {number}
*/
const maxSubarraySumCircular = function (nums) {
};
/*
最大子数组之和无外乎两种情况子数组在开头和结尾直接还有一种情况就是一部分在开头的前缀一部分在结尾的后缀
所以只需一次遍历统计前缀和的最大值和第一种情况的最大值之后再倒序遍历统计后缀的最大值之后比较这两种情况
*/
function f1(nums) {
const n = nums.length;
const leftMax = new Array(n).fill(0);
// 对坐标为 0 处的元素单独处理,避免考虑子数组为空的情况
leftMax[0] = nums[0];
let leftSum = nums[0];
let pre = nums[0];
let res = nums[0];
for (let i = 1; i < n; i++) {
pre = Math.max(pre + nums[i], nums[i]);
res = Math.max(res, pre);
leftSum += nums[i];
leftMax[i] = Math.max(leftMax[i - 1], leftSum);
}
// 从右到左枚举后缀,固定后缀,选择最大前缀
let rightSum = 0;
for (let i = n - 1; i > 0; i--) {
rightSum += nums[i];
res = Math.max(res, rightSum + leftMax[i - 1]);
}
return res;
}