给出题目一的试题链接如下:
这一题就算放到easy的题目里面也算是简单的题目了,由于每次操作改变都是2,因此直接返回 n + 2 t n + 2t n+2t即可。
给出python代码实现如下:
class Solution:
def theMaximumAchievableX(self, num: int, t: int) -> int:
return num + 2 * t
提交代码评测得到:耗时35ms,占用内存16.3MB。
给出题目二的试题链接如下:
这一题我的思路就是一个动态规划,首先找到每一个点可以到达的下一个点的位置集合,然后用动态规划的方式考察每一次跳跃之后从下一个点到达终点所需的最大跳跃次数,然后合在一起返回最大值即可。
给出python代码实现如下:
class Solution:
def maximumJumps(self, nums: List[int], target: int) -> int:
n = len(nums)
reachable = defaultdict(list)
for i in range(n-1):
for j in range(i+1, n):
if abs(nums[i] - nums[j]) <= target:
reachable[i].append(j)
@lru_cache(None)
def dp(idx):
if idx == n-1:
return 0
return max([-math.inf] + [1 + dp(i) for i in reachable[idx]])
res = dp(0)
return res if res > 0 else -1
提交代码评测得到:耗时1073ms,占用内存56.2MB。
给出题目三的试题链接如下:
这一题我的思路同样是走了一个比较暴力的动态规划——考察每一个点作为起点时所能够获得的非减子序列的最大长度,然后返回最大值即可。
给出python代码实现如下:
class Solution:
def maxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int:
n = len(nums1)
@lru_cache(None)
def dp(idx, pre):
if idx >= n:
return 0
if nums1[idx] >= pre and nums2[idx] >= pre:
return 1 + dp(idx+1, min(nums1[idx], nums2[idx]))
elif nums1[idx] >= pre:
return 1 + dp(idx+1, nums1[idx])
elif nums2[idx] >= pre:
return 1 + dp(idx+1, nums2[idx])
else:
return 0
return max(dp(i, 0) for i in range(n))
提交代码评测得到:耗时1644ms,占用内存265.3MB。
给出题目四的试题链接如下:
这一题思路上还是比较直接的,就是一个greedy的算法,我们考察第一个点 x 1 x_1 x1,显然要将其全部消除,必须要 x 1 x_1 x1次操作,此时后续 k k k个点都会改变 x 1 x_1 x1,如果改变之后某一个值小于 0 0 0,那么显然无法成功,否则,数组就变成了一个 n − 1 n-1 n−1长度的数组,我们重复上述操作即可。
给出python代码实现如下:
class Solution:
def checkArray(self, nums: List[int], k: int) -> bool:
n = len(nums)
change = [0 for _ in range(n+1)]
d = 0
for i, x in enumerate(nums):
d += change[i]
x = x + d
if x < 0:
return False
elif x > 0:
if i + k > n:
return False
change[i+k] += x
d += -x
return True
提交代码评测得到:耗时830ms,占用内存31.3MB。