减少时间复杂度

时间:2015-06-20 20:58:29

标签: c++ dynamic-programming divide-and-conquer

我有一个问题,其中给出了一组值SET A和一组值SET B.我应该找到可能从集合A取一个值而一个取值集合B的最大对数。 。 条件- 两个值之间的差异应小于11。

EG- SET A-2,3,4 SET B-14,12,250 最大对可能 - (14,4)和(12,3) 注 - (12,4)也可以是一对但是,它不会给我们最大可能的集合,因为3将被留下。因此,两个最多4对,14和12,3。

我能够以O(n ^ 2)复杂度解决这个问题,我一直在寻找更好的解决方案。

1 个答案:

答案 0 :(得分:1)

我在10分钟前回答了similar question。这里的ide是相同的:循环排序范围。

以下代码与适用于您的问题的其他答案相同(我只是用小于关系替换了相等):

auto find_pairs(std::vector<int>& arr1, std::vector<int>& arr2, int diff)
{
    std::vector<std::pair<int,int> > ret;

    std::sort(std::begin(arr1), std::end(arr1));
    std::sort(std::begin(arr2), std::end(arr2));

    auto it1= std::begin(arr1);
    auto it2= std::begin(arr2);

    while(it1!= std::end(arr1) && it2!= std::end(arr2))
    {
        if(std::abs(*it1-*it2) < diff)
        {
            ret.push_back(std::make_pair(*it1,*it2));
            ++it1;
            ++it2;
        }
        else if(*it1<*it2)
        {
            ++it1;
        }
        else
        {
            ++it2;
        }
    }

    return ret;
}

以下是您的示例的应用程序

int main()
{

    std::vector<int> arr1 = {2,3,4};   
    std::vector<int> arr2 = {14,12,250};   
    int diff=11;

    auto pairs = find_pairs(arr1, arr2, diff);

    for(auto& i : pairs)
    {
        std::cout<<i.first<<"  "<<i.second<<std::endl;
    }    
}

通过这个获得OP中给出的期望答案:

2  12
4  14

DEMO