题目描述
给定一个正整数组成的数组 nums
,返回 nums
中一个 升序 子数组的最大可能元素和。
子数组是数组中的一个连续数字序列。
已知子数组 [nums_l, nums_l+1, ..., nums_r-1, nums_r]
,若对所有 i(l <= i < r)
,nums_i < nums_i+1
都成立,则称这一子数组为 升序 子数组。注意,大小为 1
的子数组也视作 升序 子数组。
样例
输入:nums = [10,20,30,5,10,50]
输出:65
解释:[5,10,50] 是元素和最大的升序子数组,最大元素和为 65。
输入:nums = [10,20,30,40,50]
输出:150
解释:[10,20,30,40,50] 是元素和最大的升序子数组,最大元素和为 150。
输入:nums = [12,17,15,13,10,11,12]
输出:33
解释:[10,11,12] 是元素和最大的升序子数组,最大元素和为 33。
输入:nums = [100,10,1]
输出:100
限制
1 <= nums.length <= 100
1 <= nums[i] <= 100
算法
(递推) $O(n)$
- 令 $s$ 为当前连续子数组的和,初始时为 $nums(0)$。初始化答案也为 $nums(i)$。
- 从下标为 1 的位置开始遍历。由于所有数组都是正整数,所以遍历过程中,如果发现 $nums(i) > nums(i - 1)$,则 $s = s + nums(i)$;否则 $s = nums(i)$。
- 遍历过程中用 $s$ 更新答案。
时间复杂度
- 遍历数组一次,故总时间复杂度为 $O(n)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
int maxAscendingSum(vector<int>& nums) {
const int n = nums.size();
int s = nums[0], ans = nums[0];
for (int i = 1; i < n; i++) {
if (nums[i] > nums[i - 1]) s += nums[i];
else s = nums[i];
if (ans < s) ans = s;
}
return ans;
}
};