1800. 最大升序子数组和(模拟+动态规划)

111 阅读1分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    io2eZCQ1MU.png

  • 题目提示

    • 1 <= nums.length <= 100
    • 1 <= nums[i] <= 100

二、思路分析:

我们今天拿到本题是 leetcode 难度为简单题 1800.最大升序子数组和。本题要求在连续数组中找到连续是升序的子数组元素和,返回和最大的值。在本题中我们需要关注两个点:

  • 数组中所有元素的位置不动
  • 在数组中截取的子数组是连续升序的

根据题目内容,我们可以进行两种方法进行解答,思路如下:

  • 方法一: 模拟法

    • 在数组中找到连续为升序的子数组,使用for循环遍历nums,模拟实现
    • 首先定义两个变量ans,tmp 初始化为0。ans作为最终结果返回,tmp记录连续升序子数组元素和
    • for循环遍历nums,当i==0或nums[i] > nums[i-1]时,tmp与nums[i]求和,ans的结果与tmp取最大值
    • 当nums[i]小于等于nums[i-1]时,tmp被赋值nums[i]
    class Solution(object):
        def maxAscendingSum(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            ans,tmp = 0,0
    
            for i in range(len(nums)):
                if i == 0 or nums[i] > nums[i-1]:
                    tmp +=nums[i]
                    ans = max(ans,tmp)
                else:
                    tmp = nums[i]
            return ans
    
    
  • 方法二: 动态规划

    • 因为是要求连续升序子数组的和,因此我们可以使用动态规划来求解
    • 可以通过 nums[i] 与 nums[i-1]进行比较,推出如下公式dp[i]
    • 当nums[i] > nums[i-1]时:dp[i] = dp[i-1] + nums[i]
    • 当nums[i] <= nums[i-1]时:dp[i] = nums[i]
    • 创建dp数组,长度为len(nums)且元素都0,并初始化 dp[0] 为 nums[0]
    • 最后返回dp数组中最大值即可
    class Solution(object):
        def maxAscendingSum(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            n = len(nums)
            dp = [0]*n
            dp[0] = nums[0]
    
            for i in range(1,len(nums)):
    
                if nums[i] > nums[i-1]:
                    dp[i] = dp[i-1] + nums[i]
                else:
                    dp[i] = nums[i]
    
            return max(dp)
    
    

三、总结:

本题是一道简单的动态规划题目,当结果需要连续的值组成时,我们可以考虑动态规划来求解,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为nums数组的长度
  • 空间复杂度:O(1),仅使用常量空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~