c ++中超出了内存限制

时间:2017-09-15 15:01:25

标签: c++ arrays

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来跟踪每个元素重复的次数

3 个答案:

答案 0 :(得分:2)

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

一旦数组被排序,这很容易做到:从数组大小中减去当前的一个位置可以得到答案。

因此,您可以通过对数组进行排序,然后将其移动一次并检查a[i] == a.size()-i-1的每个位置来解决此问题。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

将nth_element与二分搜索结合使用可能会得到平均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;

Todo:测试,测试并检查一个