外观
跳跃游戏
⭐ 题目日期:
小米 - 2024/11/1
🌳 题目描述:
给你一个非负整数数组 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 <= 10^4
0 <= nums[i] <= 10^5
🕵🏽 面试评估:
这道题是经典的数组问题,通过贪心算法实现高效解法。它不仅考察候选人对数组的基本操作能力,还考察其算法优化能力、边界情况处理能力以及问题扩展能力。
🧗难度系数:
⭐️ ⭐️ ⭐️
📝思路分析:
这道题的思路跟古代骑马送信是一样的,起点,终点,沿途客栈可以换一匹跑的更远的马,最终判断信能否送达。
数组 [3,2,1,0,4] 代表的含义为,以公里为单位:
在位置 0 的马能跑 3 公里
在位置 1 的马能跑 2 公里
在位置 2 的马能跑 1 公里
在位置 3 没有马
位置 4 为终点位置
在送信的过程中,每经过一个客栈 i,
- nums[i] > 0, 说明有马可以选择,比较当前骑的马与客栈备用的马的马力值,选择能跑更远的马继续前行,注意当前骑的马每到一个客栈,马力值要减 1,因为跑了 1 公里。
- nums[i] == 0, 说明此客栈没有马,如果当前骑的马马力值刚好消耗为 0,则表明不能将信送到终点; 如果还有马力值,继续前行
- 优化:如果当前马的马力值大于等于剩下的行程,直接返回 True
💻代码:
Java
public boolean canJump(int[] nums) {
int maxSteps = nums[0];
for (int i = 1; i < nums.length; i++) {
if (maxSteps == 0) {
return false;
}
maxSteps = Math.max(nums[i], maxSteps - 1);
if (maxSteps >= nums.length - 1 - i) {
return true;
}
}
return true;
}
Python
def canJump(self, nums: List[int]) -> bool:
max_steps = nums[0]
for i in range(1, len(nums)):
if max_steps == 0:
return False
max_steps = max(nums[i], max_steps - 1)
if max_steps >= len(nums) - 1 - i:
return True
return True
C++
class Solution {
public:
bool canJump(vector<int>& nums) {
int maxSteps = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (maxSteps == 0) {
return false;
}
maxSteps = max(nums[i], maxSteps - 1);
if (maxSteps >= nums.size() - 1 - i) {
return true;
}
}
return true;
}
};
🚵🏻复杂度分析:
时间复杂度:O(n), n 为数组的长度,遍历数组一遍
空间复杂度:O(1)