有效地在向量中找到数字序列?

时间:2016-12-19 01:42:31

标签: c++ loops vector time-complexity

我有以下矢量:

std::vector<int> ExampleVector {10, 2, 5, 1, 8, 20};

我需要找到3个元素(A,B,C),其中:

1)A&gt; B&lt; ç

2)(A + B)> ç

3)A&lt; (B + C)

在ExampleVector的情况下,10 5 8符合上述条件。

我的初始尝试在给定条件下使用了许多迭代器:

int main()
{
  for(auto first_iterator = A.begin(); first_iterator != A.end(); first_iterator++)
  {
    for(auto second_iterator = first_iterator() + 1; second_iterator != A.end(); second_iterator++)
    {
        for(auto third_iterator = second_iterator() + 1; third_iterator != A.end(); third_iterator++)
        {
            bool condition_1 {(*first_iterator + *second_iterator) > *third_iterator};
            bool condition_2 {(*second_iterator + *third_iterator) > *first_iterator};
            if(condition_1 && condition_2)
            {
                return 1;
            }
        }
    }
  }
  return 0;
}

这实际上导致:

iterator         cycle1  cycle2  cycle3  cycle4  cycle5  cycle6  cycle7 ... N
first_iterator:    10     10       10      10      10     10       10
second_iterator:   2      2        2       2       5      5        5
third_iterator:    5      1        8       20      1      8        20

显然这是非常低效的!

我是否可以使用更好的方法解决此类问题?

2 个答案:

答案 0 :(得分:-1)

编辑

vector<vector<double>> store = vector<vector<double>>(0);    
for (int i = 0; i < theVect.size(); ++i) {
        for (vector<double> v : store) {
            if (v.size() == 1) {
                if (v[0] > B) {
                    v.push_back(b)
                    }
            } 
            else if (v.size() == 2) {
            if (A + B > C && A < B + C) {
                return true;
            }
        }
        store.push_back(vector<double> {theVect[i]});
    }

这是正确的答案。 - &GT;需要一次总迭代我相信这是N ^ 2时间,你的答案是N ^ 3时间。 (最坏情况)

*技术上比N ^ 3少一点但足够接近。

**下面是原始帖子,上面是编辑(供将来的观众使用)

哇,这是一些错综复杂的编码。

我相信你有正确的想法,但你的编码风格真的很奇怪。一种更易读的方法就是简单地使用for循环。

bool condition1 = false;
bool condition2 = false; 
bool condition3 = false;

for (int x = 0; x < theVector.size(); ++x) {
   for (int y = x + 1; y < theVector.size(); ++y) {
        for (int z = y + 1; z < theVector.size(); ++z) {
           if (!condition1) {
               condition1 = conditionChk1(theVector[x], theVector[y], theVector[z]);
           }
           if (!condition2) {
               condition2 = conditionCk2(theVector[x], theVector[y], theVector[z]);
           }
           if (!condition3) {
               condition3 = conditionCk3(theVector[x], theVector[y], theVector[z]);
           }
        }
    }
}

其中conditionCk方法接受double值并根据它们是否满足要求返回布尔值。这基本上是你的方法,不那么复杂。

答案 1 :(得分:-1)

首先,您需要问问自己是否可以改进

重新调整你的东西,以便更容易阅读...

1) B < A && B < C
2) (B + A) > C
3) (B + C) > A 

仔细观察,如果B == 0,A&gt; C和C> A,这是不可能的。