赞
踩
k % len(nums)
位置截断然后重新组合,可以用 python 的列表操作简单地如下实现class Solution:
def rotate(self, nums: List[int], k: int) -> None:
k = k % len(nums)
res = nums[-k:] + nums[:-k]
nums[:] = res
k % len(nums)
位置截断然后重新组合,这可以通过三次列表翻转实现,示意如下nums = "----->-->"; k =3
result = "-->----->";
reverse "----->-->" we can get "<--<-----"
reverse "<--" we can get "--><-----"
reverse "<-----" we can get "-->----->"
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
def _reverse(start, end):
while start < end:
t = nums[start]
nums[start] = nums[end]
nums[end] = t
start += 1
end -= 1
k = k % len(nums)
_reverse(0, len(nums)-1)
_reverse(0, k-1)
_reverse(k, len(nums)-1)
def maxProfit(self, prices: List[int]) -> int:
# 暴力法:超时
profit = -float('inf')
for i in range(len(prices)-1):
buy = prices[i]
for j in range(i+1, len(prices)):
sell = prices[j]
if sell > buy and sell - buy > profit:
profit = sell - buy
profit = 0 if profit < 0 else profit
return profit
class Solution: def maxProfit(self, prices: List[int]) -> int: # 贪心:动态维护历史最低价,进而利用它计算理论最大收益 min_price = float('inf') max_profit = -float('inf') for p in prices: # 动态维护历史最低价 if p < min_price: min_price = p # 基于历史最低价得到在当前时刻卖出的理论最大收益 profit = p - min_price if profit > max_profit: max_profit = profit max_profit = 0 if max_profit < 0 else max_profit return max_profit
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_profit = 0
for i in range(len(prices)-1):
profit = prices[i+1] - prices[i]
if profit > 0:
max_profit += profit
return max_profit
dp[i][0]
和 dp[i][1]
分别表示第
i
i
i 天交易完后手里没有和持有股票的最大利润。
dp[i][0]
来说,第
i
i
i 天交易完后手里没有股票,意味着要么前一天就没有,要么今天卖了,递推式为dp[i][1]
来说,第
i
i
i 天交易完后手里有股票,意味着要么前一天有,要么今天刚买,递推式为dp[i]
仅与 dp[i-1]
有关,而与更早的状态都无关,因此不必存储这些无关的状态,只需要将 dp[i−1][0]
和 dp[i−1][1]
存放在两个变量中,通过它们计算出 dp[i][0]
和 dp[i][1]
并存回对应的变量,以便于第
i
+
1
i+1
i+1 天的状态转移计算即可class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp0 = 0 # 今日交易完后手里没有股票的最大利润
dp1 = -prices[0] # 今日交易完后手里有一支股票的最大利润
for i in range(1, len(prices)):
dp0_ = max(dp0, dp1 + prices[i])
dp1_ = max(dp1, dp0 - prices[i])
dp0, dp1 = dp0_, dp1_
return dp0
class Solution: def canJump(self, nums: List[int]) -> bool: cur_pos = next_pos = 0 max_range = nums[cur_pos] # 当前可达的最大索引位置 while True: # 若从当前位置可以直接到目标,退出 if max_range >= len(nums) - 1: return True # 考察从当前位置可达的每个新位置可覆盖的最大范围, 贪心地选择可达范围最大处作为转移到的索引位置 next_pos for steps in range(1, nums[cur_pos] + 1): next_range = cur_pos + steps + nums[cur_pos + steps] if next_range > max_range: next_pos = cur_pos + steps max_range = next_range # 如果当前位置已经是最佳的,且已知当前 max_range 无法到达目标,退出 if next_pos == cur_pos: return False # 去向新索引位置 cur_pos = next_pos
true
,反之若遍历结束后最后位置仍不可达则返回 false
class Solution:
def canJump(self, nums: List[int]) -> bool:
max_range = 0
for i, step in enumerate(nums):
if i <= max_range:
if i + step > max_range:
max_range = i + step
if max_range >= len(nums) - 1:
return True
return False
class Solution: def jump(self, nums: List[int]) -> int: # 特殊情况直接退出 if len(nums) == 1: return 0 cur_pos = next_pos = step_cnt = 0 max_range = nums[cur_pos] while True: # 若从当前位置可以直接到目标,退出 if max_range >= len(nums) - 1: return step_cnt + 1 # 考察每一个新位置可以覆盖的最大范围,next_pos 设置为范围最大新索引位置 for steps in range(1, nums[cur_pos] + 1): next_range = cur_pos + steps + nums[cur_pos + steps] if next_range > max_range: next_pos = cur_pos + steps max_range = next_range # 去向新索引位置 cur_pos = next_pos step_cnt += 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。