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 }

浙公网安备 33010602011771号