[英]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.