Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题给出一组整数组成的数组
- 要求求出一组具有最大和的连续数组
- 子数组至少包含一个元素
二、思路分析:
我们拿到该题,脑袋里面想到的就遍历列表元素,分别以每个元素为开始进行组合并相加,然后再从中去取出最大值。
假设我们以示列:nums = [-2,1,-3,4,-1,2,1,-5,4]为代表,进行演算。如果按照常规想法去遍历,则遍历完成则需要len(nums)!=9!=45种。例如我们以-2开始组合子数组有9种。
这样去计算的话,我们无法满足题目要求的O(n)时间复杂度。
例如,我们按照上述想法实现,需要两个for循环,代码如下:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
Ans = []
for x in range(len(nums)):
S = 0
res = nums[x]
for y in range(x,len(nums)):
S = S+nums[y]
res = max(res,S)
Ans.append(res)
return max(Ans)
当数据量较大时,我们以上代码执行时间就会超时。
这时候,我们需要另辟蹊径,思考更加高效的方法。
我们需要对列表中求出最大和,拆分出步骤主要有两步:
- 两个元素进行相加
- 与前面的值进行比较大小,取最大值
换算成公式:dp[i]=max{nums[i],dp[i−1]+nums[i]}
实现以上逻辑,代码如下:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
pre = 0
Ans = nums[0]
for i in range(len(nums)):
pre = max(nums[i],pre+nums[i])
Ans = max(Ans,pre)
return Ans
三、总结:
我们提交代码,通过记录如下:
本题使用简单的动态规划,时间复杂度为O(n),空间复杂度O(1)
关于动态规划的,后续还要继续学习,把一个问题拆分一个简单的问题还是不那么容易的。
以上是本期内容,欢迎大佬们点赞评论,下期见~~~