【发布时间】:2021-12-28 13:10:33
【问题描述】:
问题描述:
如果一个数组可以通过交换其中一个数组中的最多一对元素从另一个数组中获得,则两个数组称为相似数组。 给定两个数组a和b,检查它们是否相似。
int recursionGuard = 0;
bool solution(vector<int> a, vector<int> b) {
for(int i = 0; i < a.size(); i++)
{
if(a[i] != b[i])
{
if(recursionGuard == 0)
{
recursionGuard = 1;
for (int j = i+1; j < b.size(); j++)
{
vector<int> new_b = b;
vector<int> new_a = a;
iter_swap(new_b.begin() + i, new_b.begin() + j);
new_a.erase(new_a.begin()+i);
new_b.erase(new_b.begin()+i);
if(solution(new_a, new_b) == 1)
{
return 1;
}
}
return 0;
}else
{
return 0;
}
}
}
return 1;
}
我正在使用递归来解决这个问题,几乎所有测试用例都通过了。原因是超过了较大值的时间限制。有没有办法以某种方式优化功能?
【问题讨论】:
-
约束和时间限制是什么?
-
我猜这是一个有竞争力的编程问题。我去过那儿。通常你需要明智地思考如何做你的算法。纯粹的蛮力算法几乎永远不会起作用
-
不是一直复制向量,而是通过引用工作,这肯定会大大减少这段代码所花费的时间
-
这并没有解决问题,但是函数
solution的返回类型是bool,所以return语句应该返回true或false。同样,if(solution(new_a, new_b) == 1)应该是if(solution(new_a, new_b)),因为函数调用的结果已经是布尔值了。 -
您为什么会选择使用递归解决方案?为什么需要从向量中删除项目来解决问题?