我有以下矢量:
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
显然这是非常低效的!
我是否可以使用更好的方法解决此类问题?
答案 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]});
}
*技术上比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,这是不可能的。