JavaScript 从浅入深 100 题训练计划--(23)最大子数组和(Kadane 算法)

**题目**:给定一个整数数组,找出和最大的连续子数组

maxSubArray([-2,1,-3,4,-1,2,1,-5,4]) // 6 (子数组 [4,-1,2,1])

 

 1 function maxSubArray(nums) {
 2   let maxSoFar = nums[0];  // 迄今为止的最大值
 3   let maxEndingHere = nums[0];  // 以当前位置结尾的最大值
 4   
 5   for (let i = 1; i < nums.length; i++) {
 6     // 状态转移:要么扩展之前的子数组,要么从当前元素重新开始
 7     maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
 8     maxSoFar = Math.max(maxSoFar, maxEndingHere);
 9   }
10   
11   return maxSoFar;
12 }
13 
14 // 更简洁的写法
15 function maxSubArray(nums) {
16   let maxSum = nums[0];
17   let currentSum = nums[0];
18   
19   for (let i = 1; i < nums.length; i++) {
20     currentSum = Math.max(nums[i], currentSum + nums[i]);
21     maxSum = Math.max(maxSum, currentSum);
22   }
23   
24   return maxSum;
25 }
26 
27 
28 
29 function maxSubArrayWithIndices(nums) {
30   let maxSum = nums[0];
31   let currentSum = nums[0];
32   let start = 0, end = 0, tempStart = 0;
33   
34   for (let i = 1; i < nums.length; i++) {
35     if (nums[i] > currentSum + nums[i]) {
36       currentSum = nums[i];
37       tempStart = i;
38     } else {
39       currentSum = currentSum + nums[i];
40     }
41     
42     if (currentSum > maxSum) {
43       maxSum = currentSum;
44       start = tempStart;
45       end = i;
46     }
47   }
48   
49   return {
50     maxSum,
51     startIndex: start,
52     endIndex: end,
53     subarray: nums.slice(start, end + 1)
54   };
55 }

 

posted @ 2026-09-07 15:00  小新的蜡笔  阅读(3)  评论(0)    收藏  举报