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

好了,本次就到这里

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

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


相关文章
|
2月前
|
算法 测试技术 C#
【动态规划】LeetCode2111:使数组 K 递增的最少操作次数
【动态规划】LeetCode2111:使数组 K 递增的最少操作次数
|
2月前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
22 2
|
2月前
|
算法 Java
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
36 0
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
【剑指offer】-数字在排序数组中出现的次数-32/67
【剑指offer】-数字在排序数组中出现的次数-32/67
|
C++
剑指offer 55. 数字在排序数组中出现的次数
剑指offer 55. 数字在排序数组中出现的次数
67 0
|
搜索推荐 Java
Leecode912. 排序数组
Leecode912. 排序数组
40 0
|
算法 C语言
剑指Offer 第53题:数字在升序数组中出现的次数
剑指Offer 第53题:数字在升序数组中出现的次数
116 0
剑指Offer 第53题:数字在升序数组中出现的次数
LeetCode 1636. 按照频率将数组升序排序
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。
57 0
|
算法 搜索推荐
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)
88 0
用函数的方法通过冒泡法实现对一个数组(乱序)到有序排序(由大到小排序)