Jump Game

来源:互联网 发布:葛优的网络意思是什么 编辑:程序博客网 时间:2024/04/29 15:28

Jump GameMar 25 '12

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:
A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

思路:每次选择下一步的规则是在可走步中选择(落脚点坐标+落脚点处能走步数)最大的那一个,下一步选择时递归。退出条件是到达n-1(true)或落脚点处可移动步数为0,且当前落脚点不是n-1(false)。last_range来指示搜索范围,避免重复搜索 ,这样算法是O(n)的。

这道题的例子不是很全面,所以用贪心每次跳最大步做也能通过例子,但是实际是错误的,对于类似{3,10,0,0,0,0,0,0}的例子会判断出错。


class Solution {public:    bool canJump(int A[], int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function           return jump(A,0,n,0);    }            bool jump(int A[],int origin,int n,int last_range)    {        if(origin == n-1) return true;        if(A[origin]==0 && origin != n-1) return false;                int max_x = origin;        int max_i = origin;                for(int i = last_range;i<=origin+A[origin];i++)        {            if(i + A[i] >=  n -1) return true;            if(i + A[i] > max_x){                max_x = i + A[i];                max_i = i;            }        }        return jump(A,max_i,n,origin+A[origin]);    }};
44 milli secs.


事实上,只要1-n中有一个位置是通过之前的迈步无法到达的,则n无法到达,所以简单的判断方法如下:

class Solution {public:    bool canJump(int A[], int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int reach = 0;                for(int i = 0;i < n;i++)        {            if(i > reach) return false;            reach = max(reach,i+A[i]);            if(reach >= n) return true;        }        return true;    }};

class Solution {public:    bool canJump(int A[], int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int reach = 0;                for(int i = 0;i < n && i <= reach;i++)        {            reach = max(reach,i+A[i]);            if(reach >= n-1) return true;        }        return false;    }};

56 milli secs

原创粉丝点击