当前位置: 首页 > 知识库问答 >
问题:

使用递归到达序列末尾的最小跳转次数

韦繁
2023-03-14

我有一个“使用递归到达数组末尾的最小跳跃次数”的代码。但我无法打印序列。(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

共有2个答案

邓昀
2023-03-14

从本质上讲,这是最小的修复,因此示例数据可以正常工作。我没有检查所有的边缘情况。例如,如果无法到达终点,则可能需要打印除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

沈凯康
2023-03-14

下面是一个例子,它将设置一个向量,其中每个索引在访问该索引后存储序列中正确的下一步。我让您使用结果向量按照从第一个元素到结尾的顺序编码。我还纠正了这个条件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