![](/img/trans.png)
[英]My code is failing a test due to time limit restriction, how do I decrease the time taken by my code to work?
[英]I am having some trouble to optimize my code. Certain test cases are failing due to “exceeded time limit”. How can I optimize my code?
我試圖在 Hackerrank 中解決一個問題。 我通過了所有示例測試用例,但由於“超過時間限制”錯誤,無法通過所有隱藏測試用例。 問題問題的鏈接是: 欺詐活動通知
我的代碼如下。
#include <bits/stdc++.h>
using namespace std;
vector<string> split_string(string);
// Complete the activityNotifications function below.
int activityNotifications(vector<int> v, long int d) {
long int n,ex;
long double m;
long int cap=v.size();
long int notif=0;
n=d;
for(long int i=0;i<n&&n<cap;i++,n++)
{
ex=v[n];
sort(v.begin()+i, v.begin()+i+d);
if(d%2==0)
{
m=(v[(n+i-1)/2]+v[(n+i)/2])/2.0;
}
else
{
m=v[(n+i)/2];
}
if((m*2)>=ex)
{
notif++;
}
}
return (notif-1);
}
int main()
{
vector<int>v;
long int n,d;
long int item;
cin>>n>>d;
for(long int i=0;i<n;i++)
{
cin>>item;
v.push_back(item);
}
int res=activityNotifications(v,d);
cout<<res;
return 0;
}
如何優化此代碼? 請幫忙。
目前,每一步都需要使用O(dlogd)
時間進行排序,因此總時間約為O(ndlogd)
你必須盡量減少中位數的時間。 有一種使用最小和最大堆( 示例)的方法來處理當前時刻的所有數據。 中位數是奇數d
較大堆上的元素,偶數d
是兩個堆頂部的平均值。
但是你需要滾動 window 的中位數。 所以可能的補充:使用指向堆節點的引用/指針制作並行數據結構ref[]
(以循環方式工作的列表/數組)。 當索引離開 window (大小為d
)時,從堆中刪除相應的節點,然后添加具有新值的新節點並更新堆和ref
。
每一步只需要O(logd)
時間
更新:似乎這個主題包含很多rolling window median
方法的鏈接和描述
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.