- Jump Game
思路:若数组的第k个点能到达,则第k-1个点也一定能够到达,因此我们可以遍历数组,找到不能到达的点就返回false
bool canJump(vector<int>& nums) {
if(nums.size()==0)
return false;
if(nums.size()==1)
return true;
int maxx=0; //记录此时能够到达的最远点
for (int i=0;i<nums.size()-1;i++){
if(i+nums[i]>maxx)
maxx=i+nums[i];
if(nums[i]==0 && maxx<i+1) //当前点无法到达下一个点(即步数为0),同时之前的其他点也无法到达时,下一个点就无法到达
return false;
if(maxx>=(nums.size()-1))
return true;
}
return false;
}
- Jump Game II
查找能够到达最后一个点的几何中的最前面的一个点,然后将这个点当作最后一个点,循环查找,直到第一个点,时间复杂度:O(n^2)。
int jump(vector<int>& nums) {
if(nums.size()==1){
return 0;
}
int len=nums.size();
int num=0; //步数
int maxReach=len-1; //最少步数到达的最远距离
while(maxReach!=0){
for (int i=0;i<len;i++)
if(i+nums[i]>=maxReach){
maxReach=i;
num++;
break;
}
}
return num;
}
297ms,太慢了
int jump2(vector<int>& nums) {
if(nums.size() == 0 || nums.size() == 1)
return 0;
int n = nums.size(), maxPositionVisited = 0;
int distance[n];
memset(distance, 0, sizeof (distance));
queue<int> q;
q.push(0);
while(1) {
int node = q.front();
q.pop();
if(nums[node] + node <= maxPositionVisited)
continue;
int toCover = node + nums[node] - maxPositionVisited;
while(toCover--) {
maxPositionVisited++;
if(maxPositionVisited >= n)
break;
q.push(maxPositionVisited);
distance[maxPositionVisited] = distance[node] + 1;
if(maxPositionVisited == n - 1)
return distance[n - 1];
}
}
}
8ms