我有一个“使用递归到达数组末尾的最小跳跃次数”的代码。但我无法打印序列。(vector vec中没有可打印的内容)
如有任何帮助,将不胜感激。
说明:
我想以最小跳跃从数组的第一个元素(即2)到达最后一个元素(即4)
跳转的方式:
第一个元素是2。这意味着我最多可以在阵列中进行2次跳跃。如果我跳第一步,那么我可以跳到第二个元素(即3),或者如果我跳第二步,那么我可以跳到第三个元素(即1)
第二个元素是3,所以我最多可以跳3次。在第一次跳转中,我可以达到1,在第二次跳转中,我可以达到0,在第三次跳转中,我可以达到4
这样,我希望以最少的跳转次数从数组的第一个元素到达最后一个元素<所以输出将是,从第一个元素2,我将跳到3。然后从3跳到4(最后一个元素)。所以跳了两次。( 2 - 3 - 4 )
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int jump(int arr[], int n, int start, vector<int> &vec)
{
if(start == n-1) // if start is the last element in array
return 0;
if( arr[start] == 0) // if array element is 0
return 0;
vector<int> vec1 = vec;
vector<int> vec2 = vec;
int minimum = INT_MAX;
for( int i = 1 ; i <= arr[start]; i++ )
{
vec1.push_back(start);
int _jump = 1 + jump( arr, n, start+i, vec1); // considering every jump
vec = (_jump < minimum) ? vec1 : vec2;
minimum = min(minimum, _jump);
}
return minimum;
}
int main()
{
int arr[] = { 2, 3, 1, 0, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vec;
cout << "Number of jumps " << jump(arr, n, 0, vec) << endl;
cout<<"Sequence is "<<endl;
for( auto x : vec)
cout << x <<" ";
return 0;
}
输出
Number of jumps 2
Sequence is
预期产出
Number of jumps 2
Sequence is 2 3 4
从本质上讲,这是最小的修复,因此示例数据可以正常工作。我没有检查所有的边缘情况。例如,如果无法到达终点,则可能需要打印除INT\u MAX
值以外的内容。
问题1
您希望输出值(即示例中的2、3、4),而不是索引(0、1、4)。因此,您必须推送值而不是索引。
vec1.push_back(arr[start]);
问题二
if(start == n-1) // if start is the last element in array
return 0;
这将不会在到达结束时添加最终值。您必须添加最后一个值:
vec.push_back(arr[start]);
问题3
if( arr[start] == 0) // if array element is 0
return 0;
一个没有到达终点的序列,将被认为是非常好的。您应该返回一个大值。因为_jump
是一个返回值,返回值应该是INT_MAX-1
,最小值也应该初始化为该值。
或者,也可以返回其他值,如n
。
问题4
最后,以下条件不正确:
vec = (_jump < minimum) ? vec1 : vec2;
当条件未被验证时,需要在vec1
中复制的是vect2
,因为循环使用vect1
。
下面是一个例子,它将设置一个向量,其中每个索引在访问该索引后存储序列中正确的下一步。我让您使用结果向量按照从第一个元素到结尾的顺序编码。我还纠正了这个条件if(arr[start]==0)
返回"infinity",因为如果我们访问这个元素,我们不能完成序列。
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int jump(int arr[], int n, int start, vector<int> &vec)
{
if(start == n-1) // if start is the last element in array
return 0;
if( arr[start] == 0) // if array element is 0
return INT_MAX - n;
int minimum = INT_MAX;
int step;
for( int i = 1 ; i <= arr[start]; i++ )
{
int _jump = 1 + jump( arr, n, start+i, vec); // considering every jump
if (_jump < minimum){
minimum = _jump;
step = start + i;
}
}
vec.at(start) = step;
return minimum;
}
int main()
{
int arr[] = { 2, 3, 1, 0, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vec(n, -1);
cout << "Number of jumps " << jump(arr, n, 0, vec) << endl;
cout<<"Vector: "<<endl;
for( auto x : vec)
cout << x <<" ";
return 0;
}
我得到了一个值大于或等于0的整数数组,例如:[5,6,0,4,2,4,1,0,0,4] 我被要求实现一种算法,以从索引0开始的最短“跃点”数遍历数组,其中遍历定义如下: - 如果我选择跳到索引3,它包含值4,我可以从我当前的索引(3)下一次跳到4个点-所以我现在考虑索引4到7作为序列中的下一步。 我的算法必须确定一个最小跳数解,但可以在具有相同跳数的解中任意选择。 对于本示例,以下内容将是有效输出
我试图理解一个Python解决方案,它似乎使用了动态编程。我能够遵循大部分解决方案,但我正在努力使解决方案真正正规化。 问题陈述如下: 您将获得一个整数数组。从某个起始索引,您可以进行一系列跳转。(第一、第三、第五……)序列中的跳转称为“奇数”编号跳转,以及(第2、第4、第6、…)序列中的跳转称为偶数跳转。 你可以从index跳转到index j(with
我有一个关于递归的小问题。下面的代码实际上是问题的答案到达终点的最小跳跃次数 当h==l和arr[l]==0时,函数返回sth,函数结束。否则,它将更新一个称为跳跃的变量,但我无法理解该语句。例如,当i=1或i=2时,跳跃的值是多少,依此类推。换句话说,我无法理解变量更新过程的意义。
问题是获取和数组中相应的索引,这些索引导致以较小的跳跃结束。例如:将需要s... 我说的跳跃是指跳跃;i、 e需要多少啤酒花。如果您是一个特定的索引,则可以通过该索引中的值进行跳跃。 下面是我在中的实现,它正确地给出了最小的跳转次数,但是我很难用
给定一个整数数组,其中每个元素表示可以从该元素向前执行的最大步数。编写一个函数,返回到达数组末尾(从第一个元素开始)的最小跳转次数。如果元素为0,则无法在该元素中移动。 输入: arr[] = { 1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9} 输出: 3(1- 发现了从动态规划方法到其他线性方法的多种方法。我无法理解所谓的时间线性方法。这里是一个链接,其中提出了一种线性方法。
给定一个数组,从第一个元素开始验证到达终点需要多少步。 示例:arr=[1,3,5,8,4,2,6,7,0,7,9] 1- 3个步骤。 到目前为止,我从极客那里得到了以下代码: 但是我想打印出哪些数字是最短的路径(1-3-8)。我如何调整代码来做到这一点? 我试图创建一个j的列表,但是由于5在循环中进行了测试,所以也添加了它。 问题的链接:https://www.geeksforgeeks.org