簡體   English   中英

在C ++中超出了內存限制

[英]memory limit exceeded in c++

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是用戶輸入的向量。

我在viewerBit.com上編寫此程序,它顯示了超出內存限制如何優化此代碼,我嘗試使用數組,向量,unordered_map而不是map,然后顯示分段錯誤

數組可以重復元素和負整數我也使用map來跟蹤每個元素重復多少次

這個問題背后的想法是,如何在不使用任何額外內存的情況下,找出多少個項目大於數組中的給定值。

一旦對數組進行排序,這很容易做到:從數組大小中減去當前從一個位置開始的位置即可得到答案。

因此,您可以通過以下方式解決此問題:對數組進行排序,然后遍歷一次,然后檢查每個位置的a[i] == a.size()-i-1

注意:如果在數組中允許相等的數字,則問題可能會變得更加棘手。 在這種情況下,您需要在檢測到相等范圍的開始后繼續向上移動數組。

無需使用地圖。 排序后; 只需從數組的末尾開始,對元素進行計數,並將此計數與即將到來的元素進行比較。

更新:更好-按降序對數組進行排序,並檢查是否有任何元素等於其索引。

將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;

待辦事項:測試,測試並逐一檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM