leetcode_55题——Jump Game(贪心算法)

Jump Game

Total Accepted: 43051 Total Submissions: 158263My Submissions

Question Solution

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.

Hide Tags

Array Greedy

Have you met this question in a real interview?

Yes

这道题目的意思是问你能否从A【0】跳到A【end】,每一个值是在该处所能跳跃的步数的最大值,

1.我想采用广度优先搜索的方法来做,利用队列将A[i]的位置i压入之后,将之后从i+1到i+A[i]的的位置都压进去,再在头处将i出来,并将i放进set中,之后不要再压i了

结果发现这种广度优先搜索的方法还是超出时间限制了

#include<iostream>
#include<set>
#include<queue>
using namespace std;

bool canJump(vector<int>& nums) {
	if(nums.empty())
		return false;
	if(nums[0]==0)
		return false;
	set<int> temp_set;
	queue<int> temp_queue;
	temp_queue.push(0);
	temp_set.insert(0);

	int len=nums.size();

	while(!temp_queue.empty())
	{
		int temp_int=temp_queue.front();
		temp_queue.pop();
		for (int i=0;i<=nums[temp_int];i++)
		{
			int next_location=temp_int+i;
			if(next_location==len-1)
				return true;
			if(next_location<len-1)
			{
				if(temp_set.count(next_location)==0)
				{
					temp_set.insert(next_location);
					temp_queue.push(next_location);
				}
			}
		}
	}
	return false;
}
int main()
{
	vector<int> vec;
	vec.push_back(3);vec.push_back(2);vec.push_back(1);vec.push_back(0);vec.push_back(4);
	cout<<canJump(vec)<<endl;
}

  2. 所以呢我又想到另外一种方法,应该是类似于贪心算法,先将A【i】所跳的最大位置找到,再从这个位置依次往A【i+1】处遍历,在这期间找到第二个最大的位置

再重复刚才的过程,在这个中间可以判断是否能够跳到最后。

#include<iostream>
#include<set>
#include<queue>
using namespace std;

bool canJump(vector<int>& nums) {
	if(nums.empty())
		return false;
	if(nums.size()==1)
		return true;
	if(nums[0]==0)
		return false;
	int len_nums=nums.size();
	int max_location=nums[0]+0;
	if(max_location>=len_nums-1)
		return true;
	int max_location0=0;

	while(1)
	{
		int temp_max=0;
		for(int i=max_location;i>max_location0;i--)
		{
			if(nums[i]+i>=len_nums-1)
				return true;
			if(nums[i]+i>temp_max)
				temp_max=nums[i]+i;
		}
		if(temp_max<max_location)
			return false;

		max_location0=max_location;
		max_location=temp_max;
	}
}
int main()
{
	vector<int> vec;
	vec.push_back(3);vec.push_back(2);vec.push_back(1);vec.push_back(0);vec.push_back(4);
	cout<<canJump(vec)<<endl;
}

  

时间: 2024-10-15 11:53:33

leetcode_55题——Jump Game(贪心算法)的相关文章

[LeetCode] 时间复杂度 O(n),空间复杂度 O(1) 的动态规划算法,题 Jump Game

Jump Game 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 ex

贪心算法的简述与示例

贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯.能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质. 参考:http://babybandf.blog.163.com/blog/static/61993532010112923767/ [例1]删数问题[B][/B] 试题描

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

贪心算法练习(一)

贪心算法_删数问题 AYYZOJ p1420 删数问题,算法在上一篇中讲得很详细,注意最后输出数前的零要去掉. 1 var n:string; 2 s,i:integer; 3 begin 4 readln(n); 5 readln(s); 6 while s>0 do 7 begin 8 i:=1; 9 while(i<length(n))and(n[i]<=n[i+1])do inc(i); 10 delete(n,i,1); 11 dec(s); 12 end; 13 while

算法-贪心算法

贪心算法大学的时候就已经学过也弄过,可能周末确实没想到写什么,就顺手学了当年学习的知识,贪心算法(也称为贪婪算法),贪心算法总是作出在当前看来最好的选择.贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 贪心要素 概念就是这样,如果需要详情可继续搜索获取更多信息,这个时候出现了一个问题,什么使用贪心算法?只需要满足两点即可,首先就是所求解的问题最优

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

阶段性总结-贪心算法

### 贪心算法总结 ##poj1328> 贪心算法使用点:> 雷达覆盖距离最大为d 的岛屿,也就是以岛屿为圆心,d为半径与海岸线的相交的区间为该雷达的可在范围> 尽可能少的雷达:每个岛屿都有一个上述的圆和一个雷达可在的区间范围,区间范围重叠的岛屿可共用一个雷达 ##poj1700>贪心算法使用点:A:船从right side 返回left side时速度是最快的/次快 > B:船从left side 到right side,再返回,来回的总时间最短这道题需注意 贪心策略有两

hdu 4040 (贪心算法)

这题是我们学校比赛的题目,因为当时参加精英组比赛,除了3个大二的其他都是大三大四的大神,就抱着打酱油的心态去了,结果真的打酱油了; 事后看看题目,确实有些题目以当前水平是可以做出来的,原因应该是 心态 以及 时间分配上的问题. 这题一直卡在题目什么意思上,还有一题 求前K大数的,那题最后想到用堆,但是不会写- -,忘了优先队列这个东西.所以很遗憾啊.. 总而言之就是会的东西太少了哈...还需要好好加油; 这题的意思就是说每个细胞每秒只能产生一个噬菌体,无论这个细胞里面有多少噬菌体,然后攒齐一定数

hduoj-1735 简单的贪心算法

字数统计 Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1987    Accepted Submission(s): 552 Problem Description 一天,淘气的Tom不小心将水泼到了他哥哥Jerry刚完成的作文上.原本崭新的作文纸顿时变得皱巴巴的,更糟糕的是由于水的关系,许多字都看不清了.可怜的Tom知道他闯下大祸了