122. 买卖股票的最佳时机 II
给你一个整数数组
prices
,其中prices[i]
表示某支股票第i
天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
输入:prices = [7,1,5,3,6,4] 输出:7 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。 总利润为 4 + 3 = 7 。示例 2:
输入:prices = [1,2,3,4,5] 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 总利润为 4 。示例 3:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。提示:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104
这个问题可以使用贪心算法来解决。基本思想是:如果明天的价格比今天高,那么就在今天买入,明天卖出。
# 贪心算法
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
如果明天的价格比今天高,那么就在今天买入,明天卖出。
time: O(n)
space: O(1)
"""
max_current = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
max_current += prices[i] - prices[i - 1]
return max_current
55. 跳跃游戏
给你一个非负整数数组
nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回
true
;否则,返回false
。示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。提示:
1 <= nums.length <= 104
0 <= nums[i] <= 105
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
记录当前能跳到的最远位置。
如果某一时刻,最远距离大于或等于数组最后一个元素的下标,就可以直接返回 True。
如果遍历结束后还没有返回 True,那么就返回 False。
"""
max_cover = 0
path_length = len(nums) - 1
i = 0 # 当前走到index几
while i <= max_cover:
max_cover = max(i + nums[i], max_cover)
if max_cover >= path_length:
return True
i += 1
return False
45. 跳跃游戏 II
给定一个长度为
n
的 0 索引整数数组nums
。初始位置为nums[0]
。每个元素
nums[i]
表示从索引i
向前跳转的最大长度。换句话说,如果你在nums[i]
处,你可以跳转到任意nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达
nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达nums[n - 1]
。示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2
。 从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。示例 2:
输入: nums = [2,3,0,1,4] 输出: 2提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
- 题目保证可以到达
nums[n-1]
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
每一步都尽可能增加覆盖范围
"""
current_max_cover = 0 # 当前能够覆盖的最远距离
next_max_cover = 0
steps = 0 # 步数计数器
path_length = len(nums) - 1
for i in range(len(nums) - 1): #不包括最后一个元素,因为是从第一个元素开始跳
next_max_cover = max(next_max_cover, i + nums[i])
if i == current_max_cover:
current_max_cover = next_max_cover
steps += 1
return steps