- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题:到达终点的最小跳跃次数
给定一个整数数组,其中每个元素代表可以从该元素向前移动的最大步数。编写一个函数返回到达数组末尾(从第一个元素开始)的最少跳转次数。如果某个元素为 0,则我们无法移动该元素。
例子:
输入:arr[] = {1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9}输出:3(1-> 3 -> 8 ->9)第一个元素是 1,所以只能走到 3。第二个元素是 3,所以最多可以走 3 步,即到 5 或 8 或 9。
来源:http://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/
我已经制定了一个线性时间算法来查找到达数组末尾所需的最小跳跃次数。
源码如下:
int minJumpsUpdated(int arr[], int n)
{
int *jumps = malloc(n * sizeof(int)); // jumps[n-1] will hold the result
int i =1, j = 0;
jumps[0] = 0;
for (i = 1; i < n; ) {
// if i is out of range of arr[j], then increment j
if (arr[j] + j < i && j < i) {
j++;
// else if i is within range of arr[j],
// jumps for ith element would be jumps[j]+1
} else if (arr[j] + j >= i && j < i) {
jumps[i] = jumps[j] + 1;
i++;
} else {
printf("solution does not exist");
return -1;
}
}
printf("jumps: ");
for (i = 0; i < n; i++) {
printf("%d, ", jumps[i]);
}
return jumps[n - 1];
}
例子:
1.) 最初 i=1, j=0
和 arr[] = {1, 3, 6, 1, 0, 9};
jumps[] = 0,0,0,0,0,0
2.) 作为i
在 arr[j]
范围内IE。 i<= j+arr[j]
,到达第 i 个位置所需的跳跃次数将是到达第 j 个位置的最小跳跃次数 + 1。
i=2, j=0, jumps[] = 0,1,0,0,0,0
3.) i>j+arr[j]
即 j++;
i=2, j=1, jumps[] = 0,1,0,0,0,0
4.) i<=j+arr[j]
即 jumps[i] = jumps[j]+1;
i=3, j=1, jumps[] = 0,1,2,0,0,0
5.) i<=j+arr[j]
即 jumps[i] = jumps[j]+1;
i=4, j=1, jumps[] = 0,1,2,2,0,0
6.) i<=j+arr[j]
即 jumps[i] = jumps[j]+1;
i=5, j=1, jumps[] = 0,1,2,2,2,0
7.) i>j+arr[j]
即 j++;
i=5, j=2, jumps[] = 0,1,2,2,2,0
8.) i<=j+arr[j]
即 jumps[i] = jumps[j]+1;
i=6, j=2, jumps[] = 0,1,2,2,2,3
------ 结束 ------
我无法确定该程序在哪个测试用例下无法运行。我问这个是因为在互联网上优化的解决方案使用的是 O(n^2) 的 DP。我的解决方案是线性时间。即 O(n)。所以我假设有一些情况是这个算法无法处理的。所以我很好奇它不处理什么情况。
您的帮助将不胜感激。
谢谢。
最佳答案
算法总结:
i
直到 arr[j]+j < i
)i
第一项。首先:
是的,它在 O(n)
中运行因为算法同时推送 i
一个j
只有一次来自 1
至 n
在最坏的情况下。
第二
我还没有看到 O(n²)
的证据是最佳时间复杂度。
第三种
您可以想象 arr
像这样 所以这正是您的算法所做的。您可以使用它通过归纳法证明您的算法是正确的。但正如@Leo 提到的,必须有一个解决方案。
修复无解决方案
确保 j < i
持有。
关于c - 到达终点所需的最小跳跃次数的线性时间算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301358/
我正在尝试制作一个程序,显示飞机到达和起飞的时间表,然后要求用户在 C 中输入时间。然后程序将找到最接近输入时间的到达时间用户。问题是它没有按预期工作,并且给我一个错误的到达时间,甚至不接近输入的时间
我有一个不断填充新信息行的 Excel 表,其中一列与联系客户的日期(有时为空 - 无需输入日期)相关,如果在 10 内没有收到回复从那以后的几天,我们必须发送提醒,如果过了 17 天,我们必须取消订
实际到达很简单,标签进入接收器天线范围,但是偏离是造成问题的原因。 首先,我们了解一些有关设置的信息。 标签: 它们以433Mhz的速度工作,每1.5秒钟发送一次“心跳”,移动时进入传输突发模式,这种
我构建了这段代码来从 URL 获取 XML我使用了 AsyncTask,当到达 getInputStream() 点时,半身应用程序仍然崩溃 重点是我想从 url 获取 XML 作为字符串。 我尝试不
所以我有一个 TDBGrid,我的目的是搜索 DBGrid 的 Fieldname 并将其与我的编辑的 Text 属性进行比较,如果它们相等,则 我想将找到匹配项的整列写入列表框。 通过带有 fiel
我会写得非常简单,因为实际的修复并不比我不理解的实际设计重要。似乎一旦我的 @RequestBody 命中 @Controller,有关 subtype 的信息就会丢失。 假设我们有: class A
所以我正在做这个简单的动态编程问题,关于达到 n一次只能走 1 或 2 步。我知道答案基本上是一个斐波那契序列,答案是:达到n-2的步骤数+ 到达 n-1 的步数. T(n) = T(n-1) +
(function start (){ $('.bar').each(function(i){ var $bar = $(this); $(this).append('')
我有一个程序,我在启动它之前要求用户输入。 public static void main(String args[]) { String database = JOptionPane.sho
就是这样,我必须在提交按钮上有一张图片,但它根本没有出现。 我希望它看起来像这样: 现在看到我的是这样的,我不明白为什么它没有出现在页面上。 HTML CSS #sognu { bac
click here 点击后重定向至 xyz.com/#contact, 现在我想获得div #abc的顶部位置 //set the value as a variable, and remove t
here is a fiddle to know where I am starting from 我要解决的问题涉及对单个 html 文件的内容进行“分页”,以一种将它们一次锁定在一个部分中的方式。
是否可以在传递页面部分时运行 javascript 函数?我想要实现的是类似于 Twitter Bootstrap 的 scrollspy。 最佳答案 您可以使用 waypoints 插件: http
我有一个可以动态调整其大小的 iframe。我通过父页面上的发布消息和监听器解决了这个问题,因此每次 iframe 的内容发生变化时,iframe 的大小也会发生变化,并且永远不会有滚动条。 在 if
我试图让我的导航栏在到达我在网站下方设置的 anchor 时变得透明。 这是我的HTML Home About Logo W
我写了一个简单的程序来管理姓名列表(下面是程序的一部分)。我希望函数“choice()”结束并返回到 main()——从而结束程序——当用户对变量“option”的输入为 4 时。然而,choice(
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
代码片段在 while 循环后有一个 EOF,之后必须再次重新打开文件 - fopen 被重用。我的问题是是否有办法避免这种笨拙的 fopen 双重使用或以某种方式不使用 EOF? if (!(f=f
从这个页面: http://www.beta.inegi.org.mx/app/buscador/default.html?q=e15a61a 我正在尝试检索此网址: http://www.beta.
我使用维基百科的 API 来获取有关页面的信息。API 给我这样的 JSON: "query":{ "pages":{ "188791":{ "pageid":18879
我是一名优秀的程序员,十分优秀!