leecode 解题总结:55. Jump Game

来源:互联网 发布:linux pe结构 编辑:程序博客网 时间:2024/05/17 07:27
#include <iostream>
#include <stdio.h>
#include <vector>


using namespace std;
/*
问题:
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.


分析:
这个是贪心算法。可以设定[colBegin ,colEnd]范围内的最大可跳出距离maxFur = max(maxFur, A[i] + i),
一旦抵达colEnd,触发跳跃此时更新colEnd = maxFur,如果发现最终maxFur < A.length - 1,则说明不可跳跃
证明:如果colEnd处触发跳跃都不能成功,那么在colEnd前面的任意一处跳跃也不能成功。
如果不是在colEnd处触发跳跃,则跳跃位置pos < colEnd,由于最大在小于下标colEnd的元素中最大跳跃距离<=maxFur
则选择其他处跳跃到maxFur的次数>=1,比从colEnd


输入:
5
2 3 1 1 4


5
3 2 1 0 4


3
0 2 3
输出:
true
false
false


关键:

//注意最后一个元素不能取到,因为是从其他元素跳跃到最后一个元素,而不是从最后一个元素跳跃到本身
int jumps = 0;
for(int i = 0 ; i < size - 1 ; i++)
{
maxFur = max(maxFur , nums.at(i) + i);
//到达当前所能到达的最远距离,只需要一次,累加跳跃次数
if(i == colEnd)
{
jumps++;
colEnd = maxFur;//更新下一次所能到达最远距离
}
}
//如果最后的最远距离小于 nums.size() - 1说明不可到达
//colEnd起始代表了最终可以到达的距离
if(colEnd < size - 1)
{
return false;
}
*/


class Solution {
public:
    bool canJump(vector<int>& nums) {
//数组元素为空,返回flase
        if(nums.empty())
{
return false;
}
int colEnd = 0;
int maxFur = 0;
int size = nums.size();
//注意最后一个元素不能取到,因为是从其他元素跳跃到最后一个元素,而不是从最后一个元素跳跃到本身
int jumps = 0;
for(int i = 0 ; i < size - 1 ; i++)
{
maxFur = max(maxFur , nums.at(i) + i);
//到达当前所能到达的最远距离,只需要一次,累加跳跃次数
if(i == colEnd)
{
jumps++;
colEnd = maxFur;//更新下一次所能到达最远距离
}
}
//如果最后的最远距离小于 nums.size() - 1说明不可到达
//colEnd起始代表了最终可以到达的距离
if(colEnd < size - 1)
{
return false;
}
else
{
return true;
}
    }
};


void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}


void process()
{
vector<int> nums;
int value;
int num;
Solution solution;
vector<int> result;
while(cin >> num )
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
bool isOk = solution.canJump(nums);
if(isOk)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
}
}


int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
0 0
原创粉丝点击