持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
题目描述
这是 力扣上的 1800. 最大升序子数组和,难度为 简单。
题目分析
看了本题,咱们知道题目需要咱们求的是整个序列的最大连续升序子序列的和,要求这个序列一定要是升序的,且要是连续的,中间跳一个都不行
思考一:
对于这个题,咱们可以很明确的知道,我们基本的可以使用简单模拟的方式来进行处理,那就是遍历 nums 数组,如果是升序,那么就累加,如果中断了,那么就将刚才子序列升序和记录下来,命名为 res,继续从 0 累加下一段升序序列和 tmp,当中断的时候(也就是遍历到当前数字小于或者等于前一个数字的时候) ,若 tmp > res , 则 res = tmp
这种方式,咱们就需要不断的刷新 tmp 的值和 res 的值
思考二:
对于 nums 数组中索引 i 对应的每一个元素,i 位置上的最大升序和我们可以记录为 dp[i]
例如,nums 长度为 1 的时候,则 dp[0] = nums[0]
那么当 nums 长度大于等于 2 的时候,咱们就需要考虑当前的数字是否是大于前一个数字的了,于是就可以得到下面这样的递推公式
这个时候,遍历完毕 nums,咱们的 dp 数组相应的值也填上了,这个时候,咱们就可以去遍历 dp 数组获取最大值即可了,但是这样反而做麻烦了,不如第一种方便,所以咱们本次来使用第一种思考方式来进行处理
接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现
Golang 的实现方式:
- 使用简单模拟的方式来记录当前的整个数组的最大升序和,以及当前子序列的升序和
- 遍历一次数组,校验当前的子序列升序和是否大于整个序列的升序和,若是,则替换数据
func maxAscendingSum(nums []int) int {
// 定义 res ,和 tmp 变量
// res 记录整个数组的最大升序和, tmp 记录当前升序和
res , tmp := 0,0
for index, value := range nums {
if index == 0 || value > nums[index-1] {
tmp += value
if tmp > res {
res = tmp
}
}else{
// 逻辑走到这里,说明 value 是小于等于前一个数的
tmp = value
}
}
return res
}
这种实现方式,咱们的时间复杂度 O(n),即遍历了一次 nums 数组的长度,空间复杂度是 O(1)
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~