题目
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例
1
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
2
输入:nums = [1]
输出:1
3
输入:nums = [5,4,-1,7,8]
输出:23
解法1:动态规划法
伪代码
数组nums,子序和dp[i],起始时dp[0]=nums[0]
最大子序和dp[i]=max(dp[i-1]+nums[i],nums[i])
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp=[]
dp.append(nums[0])
for i in range(1,len(nums)):
dp.append(max(dp[i-1]+nums[i],nums[i]))
return max(dp)
解法2:暴力法
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max=nums[0]
for i in range(len(nums)):
sum=0
for j in range(i,len(nums)):
sum+=nums[j]
if sum>=max:
max=sum
return max
python暴力法可能会出现超时
解法3:优化动态规划
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp=[]
dp.append(nums[0])
result=dp[0]
for i in range(1,len(nums)):
dp.append(max(dp[i-1]+nums[i],nums[i]))
result=max(result,dp[i])
return result
将O(n)优化为O(1)
解法4:贪心法
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result=nums[0]
sum=0
for i in range(len(nums)):
sum+=nums[i]
result=max(result,sum)
if sum<0:
sum=0
return result
题目:买股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
示例
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
解法1:动态规划
分析
初始时f=prices[0];dp=[];dp[0]=0
if prices[i]-f<0 then f=prices[i]
else:dp.append(prices[i]-f)
max(dp)
python代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
f=prices[0]
dp=[]
dp.append(0)
i=0
while i<len(prices):
if prices[i]-f<0:
f=prices[i]
else:
dp.append(prices[i]-f)
i+=1
return max(dp)
解法2:贪心
python代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
result=0
f=prices[0]
for i in range(1,len(prices)):
if prices[i]-f<0:
f=prices[i]
result=max(result,prices[i]-f)
return result