例如: 4 2 2 1 0 2 返回 false
2 1 3 1 1 0 返回 true
bool jump(int array[], int size)
{
}
public class Item05 {
public static boolean flag = false; //标志位
/**
* 递归实现
* @param array 台阶数组
* @param position 当前台阶位置
*/
public static void jump(int[] array, int position) {
int steps = array[position]; //可以到达的台阶数
//从1到step循环,i为跳的阶数
for (int i = 1; i <= steps; i++) {
if (position + i == array.length - 1){
flag = true;
return ;
}else
jump(array, position + i);
}
}
public static void main(String[] args) {
int[] arrays = { 2, 1, 3, 1, 1, 0 };
jump(arrays, 0);
System.out.println(flag);
}
}
def canJump(self, nums):
maxStep=nums[0]
for i in range(1,len(nums)):
if maxStep==0:
return False
maxStep-=1
if maxStep<nums[i]:
maxStep=nums[i]
return True
// 从后向前 逐个判断 用到标志位 【比较好理解】
#include <iostream>
using namespace std;
#include <vector>
bool jump(int array[], int size)
{ bool can = false;
vector<bool> is(size, false);
is[size - 1] = true;
for (int i = size - 2; i >= 0; i--)
{
for (int j =1; j <= array[i]; j++)
{
if (i + j <= size - 1)
{
if (is[i + j] == true)
{
is[i] = true;
break;
}
}
}
if (i == 0 && is[i] == true)
{
can = true;
}
}
return can;
}
void test_jump()
{
int arr1[6] = {4 ,2, 2 ,1, 0, 2};
int arr2[6] = {2 ,1 ,3 ,1 ,1 ,0};
cout<<jump(arr1,6)<<endl;
cout<<jump(arr2,6)<<endl;
}
int main()
{
test_jump();
return 0;
}
//时间复杂度: o(n)~o(n^2)
//空间复杂度:o(n);
#include<stdio.h>
#include<malloc.h>
int jump(int arr[], int size)
{
int *p_flag = NULL;
int i, j;
if (NULL == arr || 0 >= size)
return 0;
else if (1 == size)
return 1;
p_flag = (int*)malloc(sizeof(int)*size); //对应第i个台阶的flag,若为1则表示可以到达,0则不可以
memset(p_flag, 0, sizeof(int)*size);
if (arr[0] <= 0)
return 0;
for (i = 1; i <= arr[0]; i++)
p_flag[i] = 1;
for (i = 1; i < size; i++)
{
//台阶从第1个开始,如果当前这个台阶i可以到达,当前台阶最大可向前走arr[i]步,
//置标志位,使台阶第 i+1 到 i + arr[i] 台阶标志位都为1;
if (1 == p_flag[i])
{
// 注意条件 i + j < size 避免溢出
for (j = 1; j <= arr[i] && i + j < size; j++)
{
p_flag[i + j] = 1;
}
//可能存在中间第i个台阶就可以直接跳arr[i]步,直接到最后一个台阶,此时可提前结束判断。
if (1 == p_flag[size - 1])
return 1;
}
}
return p_flag[size - 1];//返回最后一个台阶标志
}
int main()
{
int arr[2][20] = { { 4, 2, 2, 1, 0, 2 } ,
{ 2, 1, 3, 1, 1, 0 } };
printf("arr0: %d\n", jump(&arr[0][0], 6));
printf("arr1: %d\n", jump(&arr[1][0], 6));
return 0;
}
这道题我考虑用递归的方法解题。 package zhang;
//4 2 2 1 0 2 返回 false
//2 1 3 1 1 0 返回 true
public class Step {
private boolean flag=false;//设置标志位
public static void main(String[] args)
{
int [] ladder={2,1,3,1,1,0};
Step step=new Step();
step.stepLadder(ladder, 0);
if(step.flag)
System.out.println("可以到达!");
else
System.out.println("无法到达!");
}
public void stepLadder(int [] ladder,int start)
{
int i;
for(i=start;i<=ladder.length-1;i++)
{
if((ladder[start]==0)||(start+ladder[start]>ladder.length-1))
break;
if(start+ladder[start]==ladder.length-1)
flag=true;
else
stepLadder(ladder,start+ladder[start]);
}
}
}从数组第一个开始跳,下次跳的位置为本次的开始位置加上跳的步数(题目只是说了最大步数,不一定非得跳最大步数)start+ladder[start],那么从ladder[start]往后的数组又是一个跳台阶问题,可以考虑用递归
static boolean jump(int array[], int size) {
boolean []boolArr = new boolean[size];
return isJump(array, boolArr, 0, size);
}
private static boolean isJump(int[] arr, boolean[] boolArr, int i, int size) {
// TODO Auto-generated method stub
if (i == size - 1)
return true;
if (arr[i] == 0) {
boolArr[i] = false;
}
boolean isNextStepOk = isJump(arr, boolArr, i + 1, size);
if (isNextStepOk) {
boolArr[i] = true;
}
if ((isNextStepOk && arr[i] > 0 ) || size - i - 1 <= arr[i])
return true;
for (int k = i + 2; k < i + arr[i]; k++) {
if (boolArr[k] == true)return true;
}
return false;
}
public class CanReachTop {
private boolean canReach(int i, boolean[][] w) {
if (i == 0)
return true;
boolean rst = false;
for (int j = 0; j < i; j++) {
rst = rst || w[j][i];
}
return rst;
}
public boolean jump(int array[], int size) {
int n = array.length;
boolean[][] w = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (canReach(i, w)) {
if (j - i <= array[i]) {
w[i][j] = true;
if (j == n - 1)
return true;
}
}
}
}
return false;
}
public static void main(String[] args) {
CanReachTop canReachTop = new CanReachTop();
int[] a = {4, 2, 2, 1, 0, 2};
System.out.println(canReachTop.jump(a, 3));
}
}
bool jump(int array[], int size)
{
if(array == NULL || size <= 0)
{
cout<<"输入有误..."<<endl;
return false;
}
bool isLastOne = false;
int i=0;
while(i < size-1)
{
if(array[i] == 0)
{
isLastOne = false;
break;
}
i += array[i];
}
if( i == size-1)
isLastOne=true;
return isLastOne;
}