繁体   English   中英

通过C ++找到给定未排序序列中第一个最长的升序或降序子序列

[英]find the first longest ascending or descending sub-sequence in a given unsorted sequence by C++

我正在编写一个C ++程序,它可以找到并打印整数向量的第一个最长的升序或降序连续子序列。 例如,给定一个向量

 4, 2, 1, 2, 3, 4, 3, 5, 1, 2, 4, 6, 5

返回1,2,3,4

我的代码如下:

但是,我不知道如何返回第一个最优解决方案。 例如,上述序列具有1,2,4,6,其也是4长。 但是,我们只需要返回1,2,3,4。

bool findLong(const vector<int> v)
{
  if (v.size() <1)
    return false;
  if (v.size() == 1){
    cout << v[0] << endl;
    return true;
  }
  vector::const_iterator itr_left, itr_right;
  itr_left = v.begin();
  itr_right = v.begin()+1;
  bool ascending_flag ;
  int counter =0;
  if (*itr_right > *(itr_right-1)){
    bool ascending_flag = true;
    ++ascending_counter;    
  } 
  else{
    bool ascending_flag = false;
    ++descending_counter;
  }
  int longest = INT_MIN;
  Vector<int>::iterator longest_left = v.begin(), longest_right =v.begin(); 
  ++itr_right; 
  while (itr_right != v.end())
  {
   if (ascending_flag && *itr_right > *(itr_right-1))
     ++ascending_counter; 

   if (!ascending_flag&& *itr_right < *(itr_right-1))     
     ++descending_counter;       

   if  (ascending_flag&& *itr_right < *(itr_right-1))
   {
     if (ascending_counter > longest )
     {
        longest  = ascending_counter;
        longest_left = itr_left;
        longest_right = itr_right;
    }
    itr_left = itr_right;    
    ascending_counter = 0 ;  
    ascending_flag = false;
  }
  if  (ascending_flag && *itr_right > *(itr_right-1))
  {
    if (descending_counter > longest )
    {
        longest  = descending_counter;
        longest_left = itr_left;
        longest_right = itr_right;
    }       
    itr_left = itr_right;      
    descending_counter = 0 ;
    ascending_flag = true;
  }
  ++itr_right;
 }
 for_each( longest_left , longest_right, print);
 cout << endl;
}

Void print(int i)
{
  cout << i << " , " ;
}

欢迎任何评论!

谢谢 !

您的代码中有很多拼写错误:您隐藏了ascending_flag的初始化您的长度计数似乎不正确。

以下应该有效(只要没有两个具有相同值的邻居)。

bool findLong(const vector<int>& v)
{
    if (v.empty())
        return false;
    if (v.size() == 1) {
        cout << v[0] << endl;
        return true;
    }
    vector<int>::const_iterator itr_left = v.begin();
    vector<int>::const_iterator itr_right = v.begin() + 1;
    vector<int>::const_iterator longest_left = itr_left;
    vector<int>::const_iterator longest_right = itr_right;
    bool ascending_flag = (*itr_right > *(itr_right - 1));

    for (++itr_right; itr_right != v.end(); ++itr_right)
    {
        if (ascending_flag ^ (*itr_right < *(itr_right - 1)))
        {
            if (itr_right - itr_left > longest_right - longest_left)
            {
                longest_left = itr_left;
                longest_right = itr_right;
            }
            itr_left = itr_right - 1;
            ascending_flag = !ascending_flag;
        }
    }
    for_each(longest_left, longest_right, print);
    cout << endl;
    return true;
}

以下是一些想法:

  1. 如果函数名为“findX()”,则它应返回X(例如,指向序列的第一个元素的指针或NULL,或第一个元素的索引或-1)。 如果函数打印X,则应将其命名为“printX()”。
  2. 目前尚不清楚你是否需要提升或严格提升序列(即(1,2,2,3)对你有好处)。
  3. 你太复杂了。 如果你需要第一个序列,你只需使用反向迭代器并从头到尾,就像这样(我不使用迭代器,但应该清楚如何包含它们):

     int maxLength=1, currentUp=1, currentDown=1; //Last element is sequence of 1 element size_t result = v.length()-1; for(size_t i = v.length()-1; i!=0; --i){ if(v[i-1] > v[i]) { currentDown++; currentUp=0; } else if(v[i-1] < v[i]) { currentUp++; currentDown=0; } else { //Not clear what should happen, change may be needed currentUp++; currentDown++; } if(maxLength <= max(currentUp, currentDown)) { result = i-1; maxLength = max(currentUp, currentDown); } } return result; 

好吧,首先,你的功能总是会返回true。

if (v.size() <1)
  return false;
if (v.size() == 1)
  cout << v[0] << endl;
return true;

应该是

if (v.size() <1) {
  return false;

} else if (v.size() == 1) {
  cout << v[0] << endl;
  return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM