【问题标题】:Find the length of the longest increasing subsequence求最长递增子序列的长度
【发布时间】:2014-11-05 16:00:04
【问题描述】:

我用 C 语言编写了一些代码,给定一个序列,它应该找到最长递增子序列的长度。但是,当它不正确时,它总是返回长度 4。

到目前为止,这是我的代码:

int LIS(int* seq, int* temp_seq, int seq_size)  
{int i, j;

for(i=0; i<seq_size; i++);
{ 
  temp_seq[i]=0; 
}
  for(i=1; i<seq_size; i++);
  { 
     for(j=1; j<seq_size; j++)
     { 
       if (seq[i]<temp_seq[j])
       seq[i]=temp_seq[j];

       else if (seq[i]>temp_seq[j]) 
       seq[i]=temp_seq[j+1];
     } 
  }
 return(sizeof temp_seq);
}

我做错了什么?

我还应该注意,该序列列出了从 1 到 n 的所有整数,没有重复的数字。

【问题讨论】:

  • 有些方面不清楚。发布示例输入和预期输出。
  • 这种行:seq[i]=temp_seq[j];正在踩原始序列,可能不是您想要做的。唯一设置 temp_seq[] 的地方是它的初始设置为全 0
  • 这一行:return(sizeof temp_seq);正在返回指针 temp_seq 的大小,对于您的 C 实现来说,它是 4
  • 代码应该允许数字序列中的不连续性。 IE。当遇到

标签: c sequence


【解决方案1】:
  1. 返回错误值。 return(sizeof temp_seq); 是一个常数,指针temp_seq 的大小。 @eurythmia

  2. ;for(i=0; i&lt;seq_size; i++); 之后当然不需要,因为它完成了循环。 for(i=1; i&lt;seq_size; i++); 也一样。

  3. seq[0] 的值从未经过测试,也从未保存在 temp_seq 中。

  4. 可能的访问通过seq[i]=temp_seq[j+1];的数组末尾

  5. 代码似乎要清除temp_seq[],然后将所有seq[] 设置为temp_seq[]

【讨论】:

    【解决方案2】:

    tmp_seq 在函数定义中被声明为指向int 类型的指针。因此,您的函数总是返回 int * 的大小(在这种情况下恰好是 4 个字节)。

    【讨论】:

    • 啊我想我明白了,但我不确定该怎么做,你有什么建议吗?我将不得不改变很多,还是我要关闭?
    • 类似于什么?关于您的第一个建议,我对该程序的部分规范是在其中包含“int * ...”,因此我无法更改。
    • 您可以尝试一些方法。第一种是使用int tmp_seq[] 而不是int *tmp_seq。您可以尝试的第二件事是保留一个计数器,每当您发现一个元素是递增子序列的一部分时,您就会递增该计数器。您需要为“最大大小”保留另一个计数器,您可以使用它来确定当前子序列是大于还是小于上一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多