【问题标题】:memory limit exceeded in c++c++中超出内存限制
【发布时间】:2018-02-24 19:44:29
【问题描述】:
int Solution::solve(vector<int> &A)
{
    sort(A.begin(), A.end());
    map<int, int>ma;
    int m;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]] = 1;
    for (int i = 0; i<A.size(); i++)
        ma[A[i]]++;
    if (A.size() == 1 && A[0] == 0)
        return 1;
    if (ma[A[0]] == (A.size() + 1))
        return -1;
    for (int i = 0; i<A.size(); i++)
    {
        if (ma[A[i]]>2 && ma[A[i]]>0)
        {
            m = A.size() - (i + 1) - (ma[A[i]] - 2);
            ma[A[i]] = -1;

        }
        if (ma[A[i]] == 2)
            m = A.size() - (i + 1);
        if (m == A[i])
        {

            return 1;
        }
    }
    return -1;
}

给定一个整数数组,求数组中是否存在整数p,使得数组中大于p的整数个数等于p 如果找到这样的整数,则返回 1,否则返回 -1。 A是用户输入的向量。

我正在 interviewBit.com 上编写这个程序 它显示 MEMORY LIMIT EXCEEDED 如何优化此代码,我尝试使用数组、向量、unordered_map 而不是 map 然后显示分段错误

数组可以包含重复元素和负整数 我使用 map 来跟踪每个元素重复的次数

【问题讨论】:

  • 如果您正在寻找有关工作代码的反馈,请考虑在 codereview.stackexchange.com 发帖。
  • 你不应该在这里问这个问题!
  • 为什么需要地图?排序后从头开始。最后一个值没有比它更大的成员 - 所以它应该是 0 来匹配条件。下一个应该是 1,下一个应该是 2...直到找到匹配或丰富的索引 0。
  • 内存限制是多少?
  • @ArtemyVysotsky 地图用于跟踪重复元素(如果有)

标签: c++ arrays


【解决方案1】:

这个问题背后的想法是如何在不使用任何额外内存的情况下计算出数组中有多少项大于给定值。

一旦对数组进行排序,这很容易做到:从数组大小中减去当前从 1 开始的位置就可以得到答案。

因此,您可以通过对数组排序,然后遍历一次,并检查每个位置是否有a[i] == a.size()-i-1 来解决这个问题。

注意:如果允许数组中的数字相等,问题可能会变得有点困难。在这种情况下,您需要在检测到相等范围的开始后继续向上遍历数组。

【讨论】:

    【解决方案2】:

    无需使用地图。排序后;只需从数组的末尾开始,计算元素并将此计数与即将到来的元素进行比较。

    更新:更好 - 按降序对数组进行排序并检查是否有任何元素等于其索引。

    【讨论】:

    • @Mohsen_Fatemi 通过不使用额外内存来优化代码 - 它如何不回答问题?
    【解决方案3】:

    将第 n 个元素与二进制搜索相结合可能会得到平均 O(N) 的结果 (~2N+logN)。

    前面完全未经测试的代码:

    auto start = v.begin();
    auto last  = v.end();
    
    while(start != last) {
    
        auto half = (std::distance(start, last)/2);
        auto median = start + half;
        std::nth_element(start, median, last);
        auto med = *median;
    
        if (med > half) {
          if (*median > std::distance(median, v.end()))
            return -1; // early out
          last = median;
        } else {
          if (*median < std::distance(median, v.end()))
            return -1; // early out
          start = median;
        }     
    }
    
    if (*start == std::distance(start, v.end())
      return 1;
    return -1;
    

    待办事项:测试、测试并检查是否关闭

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      相关资源
      最近更新 更多