1800. 最大升序子数组和:简单模拟方式

简介: 这是 力扣上的 1800. 最大升序子数组和,难度为 简单。

题目描述

这是 力扣上的 1800. 最大升序子数组和,难度为 简单

image.png

题目分析

看了本题,咱们知道题目需要咱们求的是整个序列的最大连续升序子序列的和,要求这个序列一定要是升序的,且要是连续的,中间跳一个都不行


思考一:

对于这个题,咱们可以很明确的知道,我们基本的可以使用简单模拟的方式来进行处理,那就是遍历 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[i1],则有

dp[i]=dp[i−1]+nums[i]dp[i] = dp[i-1] + nums[i]dp[i]=dp[i1]+nums[i]

若当前数字不大于前一个数字的时候,nums[i]<=nums[i−1],则有若当前数字不大于前一个数字的时候, nums[i] <= nums[i-1],则有若当前数字不大于前一个数字的时候,nums[i]<=nums[i1],则有

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)

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
5月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
【leetcode】23. 合并K个升序链表
【leetcode】23. 合并K个升序链表
58 0
|
8月前
二叉树之推排序(升序)
二叉树之推排序(升序)
89 0
了解冒泡排序,并写出一个函数进行排序,拍成升序
了解冒泡排序,并写出一个函数进行排序,拍成升序
|
算法 搜索推荐
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)
126 0
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)
|
算法 Java
|
算法
【排序】归并类排序—归并排序(逆序数问题)
在排序中,我们可能大部分更熟悉冒泡排序、快排之类。对归并排序可能比较陌生。然而事实上归并排序也是一种稳定的排序,时间复杂度为O(nlogn).
119 0
【排序】归并类排序—归并排序(逆序数问题)