查找数组的最小子序列

时间:2016-11-07 20:47:48

标签: 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++;
    }
    return m;
}

我想创建一个从1到r的数组,这是一个数组的长度,充满了自然数,即{1,2,3 ...}。然后我想将它与实际数组t进行比较。如果匹配则查找另一个。

我不知道它为什么不起作用以及如何修复它?

无论如何代码不起作用,我仍然不知道如何解决这个问题。

仍在寻找答案。

更新:我做了类似的事情:

int array(int* t, int r) {

for(int x=0;x<r;x++){

    for(int y=0; y<r-1;y++){
        if(t[y]>t[y+1]){
            int temp=t[y+1];
            t[y+1]=t[y];
            t[y]=temp;
        }
    }
}
   for (int i = 0; i != r; i++) {
        if (t[i] != (i + 1)) {
            return i + 1;
        }
    }
    return r + 1;
}

然而,当在输入数组中,我在某个地方为零时,例如{5,0,1,2}函数总是,无论放置零的位置都返回1.为什么会这样?

3 个答案:

答案 0 :(得分:5)

您的代码存在许多问题

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;
}
  • a未初始化,即它未指向程序分配的有效内存。你需要做int *a = new int[r]在功能返回之前不要忘记delete a
  • i应该最多r - 1而不是r。所以i < r而不是i <= r

这是一些伪代码,概述了解决此问题的可能方法。如果无法找到有效的范围,则结果为零。

伪代码(快速,多亏Kenny Ostrom

  • curr = 0
  • lookup = std::unordered_set<int>
  • 将所有元素插入lookup
  • 0开始到n,其中n是元素数组的大小
    • [循环]
      • 如果curr + 1不在lookup突破循环
      • 否则将curr设置为curr + 1
    • [Loop End]
  • 最后返回curr + 1

伪代码(有点快速取决于您的排序算法)

  • 对数组进行排序(std::sort始终是一个不错的选择)
  • 将变量curr设置为0
  • 0 开始到 n ,其中 i 是索引 i
    • [循环]
      • 如果curr + 1不等于 i 然后突破循环
      • 否则将curr设置为 i
    • [Loop End]
  • 最后返回curr + 1

伪代码(慢)

  • 将变量curr设置为0
  • 0 开始到 n ,其中 i 是索引 i的数组元素

    • [循环]
      • j 开始到 n ,其中j = 0
        • [循环]
          • 如果curr + 1等于 j ,则将curr设置为 j 并打破此循环
        • [Loop End]
        • 如果curr没有改变,那就打破这个循环
    • [Loop End]
  • 最后返回curr + 1

答案 1 :(得分:2)

您不需要额外的数组,您可能只是迭代直到索引与您的期望不匹配:

{{1}}

答案 2 :(得分:1)

经过反思,我认为你原来的想法非常接近一个好的算法,如果你修复了错误,并完全忽略任何值[i],其中该值不在[1..r]范围内。 / p>

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

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