LeetCode 1800: Maximum Ascending Subarray Sum (One Pass Running Segment Sum)
LeetCode 1800ArrayGreedyToday we solve LeetCode 1800 - Maximum Ascending Subarray Sum.
Source: https://leetcode.com/problems/maximum-ascending-subarray-sum/
English
Problem Summary
Given an integer array, find the maximum possible sum of a contiguous subarray that is strictly ascending, meaning each next element is greater than the previous one.
Key Idea
Use one pass. Keep a running sum for the current ascending segment. If nums[i] > nums[i-1], extend the segment. Otherwise, start a new segment at nums[i]. Track the global best sum at each step.
Algorithm
1) Initialize cur = nums[0], best = nums[0].
2) For each i from 1 to n-1:
- If nums[i] > nums[i-1], set cur += nums[i].
- Else set cur = nums[i].
3) Update best = max(best, cur).
4) Return best.
Complexity
Time complexity O(n), space complexity O(1).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxAscendingSum(int[] nums) {
int cur = nums[0], best = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur += nums[i];
} else {
cur = nums[i];
}
best = Math.max(best, cur);
}
return best;
}
}func maxAscendingSum(nums []int) int {
cur, best := nums[0], nums[0]
for i := 1; i < len(nums); i++ {
if nums[i] > nums[i-1] {
cur += nums[i]
} else {
cur = nums[i]
}
if cur > best {
best = cur
}
}
return best
}class Solution {
public:
int maxAscendingSum(vector<int>& nums) {
int cur = nums[0], best = nums[0];
for (int i = 1; i < (int)nums.size(); i++) {
if (nums[i] > nums[i - 1]) cur += nums[i];
else cur = nums[i];
best = max(best, cur);
}
return best;
}
};class Solution:
def maxAscendingSum(self, nums: List[int]) -> int:
cur = best = nums[0]
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
cur += nums[i]
else:
cur = nums[i]
best = max(best, cur)
return bestvar maxAscendingSum = function(nums) {
let cur = nums[0], best = nums[0];
for (let i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur += nums[i];
} else {
cur = nums[i];
}
best = Math.max(best, cur);
}
return best;
};中文
题目概述
给定整数数组,求严格递增连续子数组的最大元素和。严格递增表示后一个元素必须大于前一个元素。
核心思路
一次遍历维护当前递增段的和。若 nums[i] > nums[i-1],就把当前值并入当前段;否则从 nums[i] 重新开始新段。同时维护全局最大值。
算法步骤
1)初始化 cur = nums[0],best = nums[0]。
2)从左到右遍历数组:
- 若 nums[i] > nums[i-1],则 cur += nums[i]。
- 否则 cur = nums[i]。
3)每一步更新 best = max(best, cur)。
4)返回 best。
复杂度分析
时间复杂度 O(n),额外空间复杂度 O(1)。
参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxAscendingSum(int[] nums) {
int cur = nums[0], best = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur += nums[i];
} else {
cur = nums[i];
}
best = Math.max(best, cur);
}
return best;
}
}func maxAscendingSum(nums []int) int {
cur, best := nums[0], nums[0]
for i := 1; i < len(nums); i++ {
if nums[i] > nums[i-1] {
cur += nums[i]
} else {
cur = nums[i]
}
if cur > best {
best = cur
}
}
return best
}class Solution {
public:
int maxAscendingSum(vector<int>& nums) {
int cur = nums[0], best = nums[0];
for (int i = 1; i < (int)nums.size(); i++) {
if (nums[i] > nums[i - 1]) cur += nums[i];
else cur = nums[i];
best = max(best, cur);
}
return best;
}
};class Solution:
def maxAscendingSum(self, nums: List[int]) -> int:
cur = best = nums[0]
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
cur += nums[i]
else:
cur = nums[i]
best = max(best, cur)
return bestvar maxAscendingSum = function(nums) {
let cur = nums[0], best = nums[0];
for (let i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
cur += nums[i];
} else {
cur = nums[i];
}
best = Math.max(best, cur);
}
return best;
};
Comments