【2022-10-07每日一题】1800. 最大升序子数组和[Easy]
2022-10-07
1分钟阅读时长
2022-10-07每日一题:1800. 最大升序子数组和
难度:Easy
标签:数组
给你一个正整数组成的数组 nums
,返回 nums
中一个 升序 子数组的最大可能元素和。
子数组是数组中的一个连续数字序列。
已知子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,若对所有 i
(l <= i < r
),numsi < numsi+1
都成立,则称这一子数组为 升序 子数组。注意,大小为 1
的子数组也视作 升序 子数组。
示例 1:
输入:nums = [10,20,30,5,10,50] 输出:65 解释:[5,10,50] 是元素和最大的升序子数组,最大元素和为 65 。
示例 2:
输入:nums = [10,20,30,40,50] 输出:150 解释:[10,20,30,40,50] 是元素和最大的升序子数组,最大元素和为 150 。
示例 3:
输入:nums = [12,17,15,13,10,11,12] 输出:33 解释:[10,11,12] 是元素和最大的升序子数组,最大元素和为 33 。
示例 4:
输入:nums = [100,10,1] 输出:100
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
方法一:
详细思路过程见官方题解,这里只做个人刷题记录,方便后续查询阅读
// 容易理解
func maxAscendingSum(nums []int) (ans int) {
sum := 0
for i, v := range nums {
if i == 0 {
sum += v
continue
}
if nums[i-1] < nums[i] {
sum += v
} else {
ans = max(ans, sum)
sum = v
}
}
ans = max(ans, sum)
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
官方
func maxAscendingSum(nums []int) (ans int) {
for i, n := 0, len(nums); i < n; {
sum := nums[i]
// 计算升序序列和
for i++; i < n && nums[i-1] < nums[i]; i++ {
sum += nums[i]
}
// 记录最大和
if ans < sum {
ans = sum
}
}
return ans
}
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。