今天来解一道简单的一道题吧,这次使用两种语言,都是同一种解题思路。不知道有没有困在这道题上呢。。。。
话不多说,看题
目录
题目:
给你一个非负整数数组 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
思路:
这道题的解题思路可以使用贪心算法。贪心算法是一种在每一步做出看似最佳的选择,从而得到全局最优解的算法。
这道题中,我们可以从第一个下标开始,逐个遍历数组。对于每个下标,我们计算当前能到达的最远下标。如果当前下标已经超过了当前能到达的最远下标,则无法到达最后一个下标。否则,我们更新当前能到达的最远下标。
如果循环结束后,maxReach 已经到达或超过了最后一个下标,则可以到达最后一个下标,返回 true。否则,返回 false。
详细解题方法:
- 初始化一个变量 maxReach 为 0,表示当前能到达的最远下标。
- 从第一个下标开始遍历数组。
- 对于每个下标 i,计算当前能到达的最远下标:maxReach = max(maxReach, i + nums[i])。
- 如果 i > maxReach,则表示当前下标已经超过了当前能到达的最远下标,则无法到达最后一个下标,返回 false。
- 循环结束后,如果 maxReach 已经到达或超过了最后一个下标,则可以到达最后一个下标,返回 true。否则,返回 false。
具体代码实现:
Java:
class Solution {
public boolean canJump(int[] nums) {
int maxReach = 0; // 当前能到达的最远下标
for (int i = 0; i < nums.length; i++) {
if (i > maxReach) {
return false; // 如果当前下标已经超过了当前能到达的最远下标,则无法到达最后一个下标
}
maxReach = Math.max(maxReach, i + nums[i]); // 更新当前能到达的最远下标
}
return true; // 如果循环结束后,maxReach 已经到达或超过了最后一个下标,则可以到达最后一个下标
}
}
执行时间:2ms 打败93.67%
内存:44.57MB 打败58.53%
C语言:
int canJump(int* nums, int numsSize) {
int maxReach = 0; // 当前能到达的最远下标
for (int i = 0; i < numsSize; i++) {
if (i > maxReach) {
return 0; // 如果当前下标已经超过了当前能到达的最远下标,则无法到达最后一个下标
}
maxReach = fmax(maxReach, i + nums[i]); // 更新当前能到达的最远下标
}
return 1; // 如果循环结束后,maxReach 已经到达或超过了最后一个下标,则可以到达最后一个下标
}
执行时间:50ms 打败44.98%
内存:7.8MB 打败98.22%
时间复杂度:
这道题的时间复杂度为 O(n),其中 n 是数组的长度。这是因为我们只需要遍历数组一次,计算当前能到达的最远下标。
空间复杂度:
这道题的空间复杂度为 O(1),因为我们只需要一个变量来记录当前能到达的最远下标。
示例:
给定数组 nums = [2,3,1,1,4],我们可以按如下步骤求解:
- 初始化 maxReach 为 0。
- 从第一个下标开始遍历数组:
- i = 0,maxReach = max(0, 0 + 2) = 2。
- i = 1,maxReach = max(2, 1 + 3) = 4。
- i = 2,maxReach = max(4, 2 + 1) = 5。
- i = 3,maxReach = max(5, 3 + 1) = 6。
- i = 4,maxReach = max(6, 4 + 4) = 8。
- 循环结束后,maxReach = 8,已经超过了最后一个下标 4,因此可以到达最后一个下标,返回 true。
给定数组 nums = [3,2,1,0,4],我们可以按如下步骤求解:
- 初始化 maxReach 为 0。
- 从第一个下标开始遍历数组:
- i = 0,maxReach = max(0, 0 + 3) = 3。
- i = 1,maxReach = max(3, 1 + 2) = 5。
- i = 2,maxReach = max(5, 2 + 1) = 6。
- i = 3,maxReach = max(6, 3 + 0) = 6。
- 循环结束后,maxReach = 6,没有超过最后一个下标 4,因此无法到达最后一个下标,返回 false。