跳跃游戏(LeetCode55)

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。

示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

从第i个位置,最远可跳nums[i]步:
nums = [2, 3, 1, 1, 4, …];

从第i个位置,最远可跳至第index[i]个位置:
index[i] = i + nums[i];
index = [2, 4, 3, 4, 8, …]
若从第0位置最远可以跳至第i个位置;
则从第0位置也一定可以跳至:第1个位置、第2个位置、…、第i-1个位置。
从第0个位置,应该跳至第1、第2、…、第i-1、第i个位置中的哪个?
应该跳至第1、2、…、i-1、i位置中,又可向前跳至更最远位置(即index[1]、index[2]、…、index[i-1]、…、index[i]最大的那个) 的位置!(贪心)

思路:
1.求从第i位置最远可跳至第index[i]位置:根据从第i位置最远可跳nums[i]步: index[i] = nums[i] + i;
2.初始化:
1)设置变量jump代表当前所处的位置,初始化为0;
2)设置变量max_index代表从第0位置至第jump位置这个过程中,最远可到达的位置,初始化为index[0]。
3.利用jump扫描index数组,直到jump达到index数组尾部或jump超过max_index,扫描过程中,更新max_index。
4.若最终jump 为数组长度,则返回true,否则返回false。

class Solution {
    
    
public:
    bool canJump(vector<int>& nums) {
    
    
		vector<int> index;	//标记第i个位置最远能到达哪个位置
		for(int i = 0; i < nums.size(); i++) {
    
    
			index.push_back(i + nums[i]);
		}
		int jump = 0;
		int max_index  = index[0];
		while(jump < index.size() || jump <= max_index) {
    
    
			//当前这个位置能到达更远的地方
			if(index[jump] > max_index) {
    
    
				max_index = index[jump];
			}
			jump++;
		}
		if(jump == index.size()) {
    
    
			return true;
		}
		return false;
	}
};

int main(void) {
    
    
	vector<int> v;
	/*
	v.push_back(2);
	v.push_back(3);
	v.push_back(1);
	v.push_back(1);
	v.push_back(4);
	*/
	
	v.push_back(3);
	v.push_back(2);
	v.push_back(1);
	v.push_back(0);
	v.push_back(4);
	Solution s;
	bool res = s.canJump(v);
	cout<<res;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_37924213/article/details/107809087