C++ 寻找数组的最小子序列

C++ 寻找数组的最小子序列,c++,arrays,algorithm,loops,C++,Arrays,Algorithm,Loops,我有一个数组,例如{1,2,4,5,6}。我想让我的函数找到最大可能的数字X,这样从1,2,…,X-1开始的所有数字都在数组中。在这种情况下,X=3。数组中的数字可以是0到无穷大 我的尝试是: int array(int* t, int r) { int* a; int m=0; int i; for(i=0;i<=r;i++){ a[i]=i; if(a[i]==t[i]) m++; }

我有一个数组,例如{1,2,4,5,6}。我想让我的函数找到最大可能的数字X,这样从1,2,…,X-1开始的所有数字都在数组中。在这种情况下,X=3。数组中的数字可以是0到无穷大

我的尝试是:

int array(int* t, int r) {
    int* a;
    int m=0;
    int i;

    for(i=0;i<=r;i++){
        a[i]=i;
        if(a[i]==t[i])
            m++;
    }
    return m;
}
int数组(int*t,int r){
int*a;
int m=0;
int i;

对于(i=0;i您不需要额外的数组,您可以迭代,直到索引与预期不匹配:

int find_iota_end(const int* a, int size)
{
    std::sort(a, a + size); // if initial array is not sorted.
    for (int i = 0; i != size; ++i) {
        if (a[i] != (i + 1)) {
            return i + 1;
        }
    }
    return size + 1;
}

您的代码存在许多问题

int array(int* t, int r) {
    int* a;
    int m=0;
    int i;

    for(i=0;i<=r;i++){
        a[i]=i;
        if(a[i]==t[i])
            m++;
    }
    return m;
}
int数组(int*t,int r){
int*a;
int m=0;
int i;

对于(i=0;i经过思考,我认为您最初的想法非常接近于一个好的算法,如果您修复了错误,并且完全忽略任何不在[1..r]范围内的值a[i]

必须为第二个向量分配实际内存,并且需要两个独立的循环。如果值相关,则第一个循环填充第二个向量。第二个循环查找答案


<>这给了你空间O(n),因为你只考虑了许多可能的答案,时间O(n)因为它只是读了长度,两次。

数组索引从零开始。修改你的for循环,使它变成:(i=0;i <代码> a <代码>未初始化(不需要BTW)。仍然不工作。移动“*”同样仍然不起作用您的算法完全错误。只有当这些数字占据数组中最左边的位置并按排序顺序时,它才会起作用。您想要一个缓慢但简单的解决方案,还是一个快速但复杂的解决方案?您是在进行桶排序,使用大量内存获得快速运行时?您忘记初始化了,所以您正在尝试将数字存储在内存中未定义的随机位置。如果这是您的计划,那么您需要有两个循环,一个用于构建查找,另一个用于获取答案。对于数组{1,5,6,2,3}和size=5,此函数返回2,而应返回4。不清楚数组是否未排序,
std::sort(a,a+size);
会解决这个问题。为什么a是未初始化的?如果它以与t相同的方式初始化?@vforbiedronka它是未初始化的,因为您没有使它等于任何东西。要初始化它,您需要创建一个新数组并将
a
设置为指向该数组,或者将
a
设置为指向已创建的数组。@vforbiedronka最好是
int*a=new int[/*在这里输入您想要的大小*/]
。查看我的更新答案我会在这里抛出我的伪代码,因为您已经涵盖了错误。std::set lookup;对于输入数组中的所有数字,lookup.insert(number);在lookup中查找答案=1,递增或返回答案。(做桶式查找表的问题是,你的空间取决于答案的值,而不是输入的大小,你必须能够增长它)我的意思是无序集,我的坏。使用STD::SET并没有真正超过排序。你的二次搜索在伪代码中有一个小错误,考虑{ 2, 1, 4 }。
int array(int* t, int r) {
    int* a;
    int m=0;
    int i;

    for(i=0;i<=r;i++){
        a[i]=i;
        if(a[i]==t[i])
            m++;
    }
    return m;
}