jump-game(跳跃游戏)

https://www.nowcoder.com/practice/a2d856f493424a748bb7c9c1126e8d8d?tpId=46&tqId=29124&tPage=2&rp=2&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

题目描述

给出一个非负整数数组,你最初在数组第一个元素的位置

数组中的元素代表你在这个位置可以跳跃的最大长度

判断你是否能到达数组最后一个元素的位置

例如

A =[2,3,1,1,4], 返回 true.

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

 

这题的考点是贪心的。但是我用搜索来做。一开始的直接搜索直接超时了,加了一个now >end的小剪枝,还是超时。干脆就加个记忆化,用一个mark数组,mark[i]标记 i 点阶梯能否到终点  的 "解是否已经求出来了",然后过了。

class Solution {
public:
    bool canJump(int A[], int n) {
        if(A == nullptr || n <= 0)
			return false;

		bool  flag = false;//判断能否到最后一个元素
		vectormark(n);//标记某个阶梯能够到终点的解是否已经求过了
		
		solve(A, n, 0, n-1,flag, mark);//从第0级阶梯开始求解

		return flag;
    }

	void  solve(int a[], int n, int now, int end, bool & flag, vector & mark)
	{
		if(now == end)//走到终点
		{
			mark[now] = true;//判断now能否到终点的解已经求出来了。
			
			flag = true;//能到终点
			return ;
		}
		if(now > end)//剪枝,超过了阶梯顶部
		{
			return ;
		}
		if(a[now] == 0)//最大步数是0,原地踏步,不能走到终点了
		{
			mark[now] = true;
			return ;
		}
		
		for(int i = 1; i <= a[now]; i++)//枚举步数的大小i
		{
			now += i;//在当前点走i步
			if(!mark[now])//=从now能否到终点的解还没有求出来
			{
				//走一下
				solve(a, n, now, end, flag,  mark);
				mark[now] = true;//标记从now能否到终点的解已经求出来了

			}

			now -= i;//回溯

		}
	


	}
};


 

你可能感兴趣的:(Leetcode)