在C 中超过内存限制

memory limit exceeded in c++

本文关键字:内存 中超      更新时间:2023-10-16
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是否存在于数组中如果找到这样的整数返回1 else 1返回-1。A是用户的向量输入。

我正在访谈bit.com上编写此程序它显示内存限制超过我如何优化此代码,我尝试使用数组,矢量,unordered_map而不是映射,然后显示分段故障

数组可以具有重复的元素和负整数我已经使用映射来跟踪每个元素重复多少次

这个问题背后的想法是您如何弄清楚多少项目大于数组中的给定值,而无需使用任何其他内存。

订购数组后,这很容易执行:从数组大小中减去当前的一个基于一个基于一个的位置。

因此,您可以通过订购数组,然后走一次来解决此问题,然后检查每个位置的a[i] == a.size()-i-1

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

无需使用地图。在排序之后;只需从数组的末端进行计数元素,然后将此计数与即将到来的元素进行比较。

更新:甚至更好 - 在降序中排序数组,并检查任何元素是否等于其索引。

将nth_element与二进制搜索结合可能会在o(〜2n logn)中获得o(n)。

完全未经测试的代码:

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:测试,测试和检查一个