通过做差可以得到利润序列,然后只要利润需求的非负数求和就可以,因为这里没有手续费,某天买入之后买出可以等价为这几天连续买入卖出
class Solution:
def maxProfit(self, prices: List[int]) -> int:
profit = 0
for i in range(1, len(prices)):
profit += max(prices[i]-prices[i-1], 0)
return profit
这是一个常见的贪心算法问题。我们从数组的第一个元素开始,保持跟踪我们能到达的最远的下标。然后,我们迭代数组中的每个元素,并更新我们能到达的最远下标。如果我们能到达的最远下标大于或等于数组的长度,我们就知道我们可以到达数组的最后一个元素。以下是Python语言实现此算法的代码:
def canJump(nums):
max_jump = 0
for i, num in enumerate(nums):
if i > max_jump:
return False
max_jump = max(max_jump, i + num)
return True
这个函数的工作原理是这样的:
max_jump
记录了在迭代过程中可以跳到的最远的下标。enumerate(nums)
会遍历数组并且返回每个元素的索引i和值num。max_jump
的值,为当前的 max_jump
和 i + num
中较大的一个。这是因为,从索引i我们可以跳到的最远的下标是 i + num
。然后,如果我们没有提前返回False,那么在遍历完数组后,我们就返回True,因为我们可以到达数组的最后一个元素。
这个问题也是一个贪心算法问题,与跳跃游戏 I 的问题相似,但是我们现在需要找出到达最后一个下标的最小跳跃次数。
我们可以追踪当前位置的最大跳跃范围,并将其与最大跳跃范围内的所有位置的最大跳跃范围进行比较。我们可以保留最大跳跃范围的索引,然后当当前位置到达或超过当前的最大跳跃范围时,我们更新最大跳跃范围并将跳跃次数加1。
以下是Python语言实现此算法的代码:
def jump(nums):
n, max_reach, steps, end = len(nums), 0, 0, 0
for i in range(n - 1):
max_reach = max(max_reach, i + nums[i])
if i == end:
end = max_reach
steps += 1
return steps
这个函数的工作原理是这样的:
max_reach
记录了在迭代过程中可以跳到的最远的下标。steps
记录了跳跃的次数。end
记录了当前的最大跳跃范围。end
的值为 max_reach
,并且 steps
加1,因为我们需要跳跃到新的位置。通过贪心算法解决股票买卖和跳跃游戏问题。