持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
1 <= nums.length <= 1001 <= 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提交记录如下:
- 时间复杂度:O(n),n为nums数组的长度
- 空间复杂度:O(1),仅使用常量空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~