【问题标题】:How can i optimize this below program?我该如何优化下面的程序?
【发布时间】:2020-10-11 13:44:13
【问题描述】:

给定一个长度为 N 的数组 A。对于任何给定的整数 X,您需要找到一个严格大于 X 的整数 Z,使得 Z 不存在于数组 A 中。您需要最小化 Z 的值。

输入:

第一行:两个空格分隔的整数 N 和 Q 表示数组 A 和 分别查询的数量

第二行:N个空格分隔的整数,表示数组元素

接下来的 Q 行:每行包含一个整数 X

输出: 打印 Q 行,每行表示对应查询的答案。

示例输入:

5 2
2 7 5 9 15
3
9

样本输出:

4
10

来源 - https://www.hackerearth.com/practice/algorithms/sorting/quick-sort/practice-problems/algorithm/yet-to-keep-6f89250c/description/

我的解决方案-

int main()
{
    ll n,q;
    cin>>n>>q;
    map<ll,bool>mp;
    for(ll i=0;i<n;i++)
    {
        ll x;
        cin>>x;
        mp[x]=true;
    }
    while(q--)
    {
        ll x;
        cin>>x;
        x++;
        while(mp[x])
        {
            x++;
        }
        cout<<x<<endl;
    }
}

【问题讨论】:

  • 第 0 步是,在启用编译器优化的情况下构建代码。
  • 你假设/希望所有输入都是有效的,最好检查一下它们是否正确
  • 提示:lower_bound 是检查值的良好起点
  • std::map&lt;T, bool&gt; 只有true 值可能会被std::set&lt;T&gt; 替换。

标签: c++ sorting data-structures implementation array-algorithms


【解决方案1】:

您的查询复杂度是O(n)*(Z-X)

您可能已经通过以下方式减少到O(n)+(Z-X)

ll x;
std::cin >> x;
x++;
auto it = mp.find(x);
if (it != mp.end()) {
    while (it != mp.end() && it->first == x) {
        ++it;
        ++x;
    }
}
std::cout << x << std::endl;

但我认为,在预处理中建立间隔可以带来更好的性能 (O(log(Intervals)))。

【讨论】:

  • 嘿@Jarod42 你能详细说明一下吗?在 30 个测试用例中,我只有 3 个测试用例通过。所以请提供更多关于如何降低时间复杂度的解释。
  • 我的意思是如果数字是 1 2 3 4 5 6 7 8 9 10 40,您可以创建简单的区间 [1;10] [40;40] 以降低查询的复杂性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多