leetcode Jump Game I II 待续 贪心看不懂啊!!!!
下面是这两个题的解法:
参考博客:http://blog.csdn.net/loverooney/article/details/38455475
自己写的第一题(TLE):
#include<iostream>
#include<vector> using namespace std; bool canJump(vector<int>& nums)
{
int L = nums.size();
bool *flag = new bool[L];
for (int i = L - ; i >= ; i--)
{
int right = i + nums[i];
if (right >= L - )
flag[i] = true;
else
{
flag[i] = false;
for (int j = i + ;j<L&& j < i + nums[i]; j++)
{
if (flag[j] == true)
{
flag[i] = true;
break;
}
}
}
}
return flag[];
} int main()
{
vector<int> a = { , , , , };
cout << canJump(a) << endl;
}
贪心用step维护当前可到达的最远位置,每次的i必须在这个最远位置以内,假如不在就表明不能前进了return false。
代码:
#include<iostream>
#include<vector> using namespace std; bool canJump(vector<int>& nums)
{
int L = nums.size();
int step = ;
for (int i = ; i <= step; i++)
{
if (nums[i] + i > step)
step = nums[i] + i;
if (step >= L - )
return true;
}
return false;
} int main()
{
int a[] = { , , , , };
cout << canJump(vector<int>(a, a+)) << endl;
}
第二题:
BFS解法(MLE):
#include<vector>
#include<iostream>
#include<queue> using namespace std; typedef struct Node
{
int index;
int jumpNo;
Node(int index, int jumpNo) :index(index), jumpNo(jumpNo){};
}Node; // BFS
int jump(vector<int>& nums)
{
int i = ;
int L = nums.size();
queue<Node> que;
que.push(Node(i,));
while (!que.empty())
{
Node now = que.front();
que.pop();
for (i = now.index + ; i <= nums[now.index] + now.index; i++)
{
if (nums[i]+now.index >= L - )
{
return now.jumpNo+;
}
else
que.push(Node(i,now.jumpNo+));
}
}
return -;
} int main()
{
vector<int> a = { , , , , };
cout << jump(a) << endl;
}
自己写的也是MLE:
#include<iostream>
#include<vector>
#include<queue> using namespace std; typedef struct Node
{
int val; //从该节点能调到哪儿
int len; //该节点在第len跳被访问
int index; //当前节点的下标
Node(int val,int index, int len) :val(val), index(index),len(len){};
Node(){};
}Node; int jump(vector<int>& nums)
{
int L = nums.size();
Node* nodeArray = new Node[L];
for (int i = ; i < L; i++)
{
nodeArray[i].val = nums[i];
nodeArray[i].index = i;
nodeArray[i].len = ;
}
//vector<bool> visited(L,false);
queue<Node> visiteQueue;
nodeArray[].len = ;
visiteQueue.push(nodeArray[]);
while (!visiteQueue.empty())
{
Node temp = visiteQueue.front();
int index = temp.index;
int canStep = temp.val;
for (int i = index + ; i <= index + canStep; i++)
{
if (nodeArray[i].index+nodeArray[i].val>=L-)
{
return temp.len + ;
}
Node nextNode(nodeArray[i].val,nodeArray[i].index, temp.len + );
visiteQueue.push(nextNode);
}
visiteQueue.pop();
}
return false;
} int main()
{
vector<int> a = { ,,, , , ,,,,};
cout << jump(a) << endl;
}
内存不超的BFS:http://www.myext.cn/c/a_4468.html
动态规划解法(TLE):
#include<iostream>
#include<vector> using namespace std; int jump(vector<int>& nums)
{
int L = nums.size();
int *dp = new int[L];
dp[] = ;
for (int i = ; i < L; i++)
{
int min = INT_MAX;
for (int j = ; j < i; j++)
{
if (nums[j] + j >= i&&dp[j]+<min)
{
min = dp[j] + ;
}
}
dp[i] = min;
}
for (int i = ; i < L; i++)
cout << dp[i] << endl;
return dp[L - ];
} int main()
{
vector<int> a = { , , , , };
cout << jump(a) << endl;
}
贪心解法:
leetcode Jump Game I II 待续 贪心看不懂啊!!!!的更多相关文章
- Jump Game I&&II——入门级贪心算法
Jump Game I Given an array of non-negative integers, you are initially positioned at the first index ...
- LeetCode:Jump Game I II
Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- LeetCode:组合总数II【40】
LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...
- 对于挑战书上的很久之前都看不懂的DP看懂的突破
突破一..牢记问题概念 并且牢记dp状态方程 突破二..一直有一个求和dp转化成O1dp递推的式子看不懂.. 看不懂的原因是..没有分清求和符号作用的范围 提醒:以后遇到求和符号一定明确其求和的式子的 ...
- QQ地图api里的 地址解析函数 看不懂 javascript_百度知道
QQ地图api里的 地址解析函数 看不懂 javascript_百度知道 QQ地图api里的 地址解析函数 看不懂 javascript 2011-09-18 12:18 匿名 ...
随机推荐
- Redis底层探秘(二):链表和跳跃表
链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内 ...
- git-SSH连接配置
1.1 在电脑端生成sshkey文件 打开git bash 输入: ssh-keygen -t rsa -C "xxxxxxx邮箱地址" 期间要输入两次密码[github远程添加s ...
- 利用TaskScheduler处理Queue、Stack等类型的操作队列(生产者消费者场景)
我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出) ...
- Hibernate基础(一)
Hibernate是ORM开源组件 源码:http://sourceforge.net/projects/hibernate/ 1.Hibernate的配置文件. 默认配置文件: hibernate. ...
- C Primer Plus学习笔记(五)- C控制语句:循环
伪代码的概念: 伪代码是一种用简单的句子表示程序思路的方法,它与计算机语言的形式相对应.伪代码有助于设计程序的逻辑.确定程序的逻辑无误之后,再把伪代码翻译成实际的编程代码.使用伪代码的好处之一是,可以 ...
- PowerDesigner生成sql脚本时去掉双引号并把字段名设为大写
Database菜单—Edit Current RDBMS 找到Script---sql—Format--- CaseSensitivityUsingQuote,把它设置为NO 这样再用sql pre ...
- CSS——position
position是指元素的定位方式,有:static.absolute.fixed.relative.inherit 5种. static 默认,布局排版方式按照HTML代码的顺序布局. absolu ...
- 10-24C#基础--枚举
一.枚举 1.定义:在程序编写中,枚举同结构体是并列的,位于Class下面:枚举是常量的集合. enum meiju://枚举是常量的集合,一般冒号后面不指定数据类型 2.格式: enum meiju ...
- 蓝牙服务 UUID
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx 手机蓝牙对手机 ,华为平板取红米手机 8 个Audio So ...
- DAY7-面向对象之绑定方法与非绑定方法
一.类中定义的函数分成两大类 一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_met ...