55. 跳跃游戏
弄一个可移动的范围,然后在范围内一步一步的移动;如果某一步使可移动范围增加了,就更新我们的可移动范围。如果可移动范围覆盖了数组的长度,那就是能到达,否则就达到不了。
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums) == 1:
return True
cover = 0
i = 0
while i <= cover:
cover = max(i+ nums[i], cover)
if cover >= len(nums) - 1:
return True
i += 1
return False
45.跳跃游戏 II
dp 暴力,算了一下范围,肯定不会有超过len(nums)的,但是时间太长了
class Solution:
def jump(self, nums: List[int]) -> int:
dp = [100000001] * len(nums)
dp[0] = 0
for i in range(len(nums)):
for j in range(i):
if j + nums[j] >= i:
dp[i] = min(dp[i], dp[j] + 1)
return dp[-1]
定义两个覆盖范围:当前,下一个
在当前范围,没移动一下i就需要计算,这样把当前范围呢遍历完的时候,就可以找到从当前范围能达到的最远范围,不管怎么走,都只需要一步;
当i到了当前的覆盖范围,就需要进入下一个覆盖范围,这个时候步数就需要加1了,然后判断是不是能到达最后
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) == 1:
return 0
cur_ = 0
step = 0
next_ = 0
for i in range(len(nums)):
next_ = max(i+ nums[i], next_)
if i == cur_:
step += 1
cur_ = next_
if cur_ >= len(nums) - 1:
break
return step
1005.K次取反后最大化的数组和
leetcode 1005.K次取反后最大化的数组和
代码随想录
我最开始想要直接排序,然后再去取反;但是最后去找数值最小的就比较麻烦,carl说直接按照绝对值排序,很好的办法。
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort(key=lambda x:abs(x),reverse=True)
for i in range(len(nums)):
if nums[i] < 0 and k > 0:
nums[i] *= -1
k -= 1
if k % 2 == 1:
nums[-1] *= -1
return sum(nums)