【问题标题】:Recursion Function exceeds Time limit for Large Values递归函数超过大值的时间限制
【发布时间】: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语句应该返回truefalse。同样,if(solution(new_a, new_b) == 1) 应该是if(solution(new_a, new_b)),因为函数调用的结果已经是布尔值了。
  • 您为什么会选择使用递归解决方案?为什么需要从向量中删除项目来解决问题?

标签: c++ recursion vector


【解决方案1】:

你在暴力破解这个问题,这总是会导致痛苦 - 代码慢,内存消耗高,你说的。这样的算法问题需要一点创造性思维。

让我们看看你的问题陈述:看看两个数组是否可以通过交换一个数组中的最多一对元素来相等。

这意味着什么?

这种情况可能发生,如果两个数组恰好在两个地方不同 - 如果它是三个或更多,那么一次交换是不够的。因此,您有一个捷径:如果两个数组在三个或更多地方不同,则它们不能相等。仅此“过滤器”就可以为您的 CPU 节省大量计算量。

然后,假设我们的两个数组只有两个地方不同。我们如何检查一次交换是否会使它们相同?我相信你能想出来。

【讨论】:

  • 感谢您的反馈!我是 C++ 编程的新手,想用递归尝试这个问题,因为我仍然在努力解决它。我想知道一般情况下是否有某种方法可以优化递归的使用。
  • @JoelD'Souza 使用递归来解决问题并学习使用它会很有趣,但这个问题尤其不适合。它没有任何递归:只有两个需要线性迭代的数组。
  • @JoelD'Souza 不要从解决随机问题开始学习 C++,而是从语言本身开始。
猜你喜欢
  • 2017-02-02
  • 2015-05-20
  • 2014-08-09
  • 2020-04-14
  • 1970-01-01
  • 2014-06-01
  • 2022-01-21
  • 2012-01-04
  • 2020-10-09
相关资源
最近更新 更多