题目描述
这是 力扣上的 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[i]>nums[i−1],则有若当前数字大于前一个数字,nums[i] > nums[i-1],则有若当前数字大于前一个数字,nums[i]>nums[i−1],则有
dp[i]=dp[i−1]+nums[i]dp[i] = dp[i-1] + nums[i]dp[i]=dp[i−1]+nums[i]
若当前数字不大于前一个数字的时候,nums[i]<=nums[i−1],则有若当前数字不大于前一个数字的时候, nums[i] <= nums[i-1],则有若当前数字不大于前一个数字的时候,nums[i]<=nums[i−1],则有
dp[i]=nums[i]dp[i] = nums[i]dp[i]=nums[i]
这个时候,遍历完毕 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)
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~