【问题标题】: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?我在优化我的代码时遇到了一些麻烦。某些测试用例由于“超过时间限制”而失败。如何优化我的代码?
【发布时间】:2023-04-08 14:15:01
【问题描述】:

我试图在 Hackerrank 中解决一个问题。我通过了所有示例测试用例,但由于“超过时间限制”错误,无法通过所有隐藏测试用例。 问题问题的链接是:Fraudulent-activity notification

我的代码如下。

#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;   
   }

如何优化此代码? 请帮忙。

【问题讨论】:

  • 你用的是什么输入法?
  • @tadman 示例输入:9 5 2 3 4 2 3 6 8 4 5 其中 9 是数组大小,5 是数组元素剩余的尾随天数。输出:2
  • 在尝试优化时,您必须始终关注算法。在这里,您在每个步骤中对数组进行排序,而您知道该数组已经在上一步中排序,并且您只是删除了一项并添加了一项新的。恕我直言,关键在这里。
  • 好吧,就我理解你的代码而言,它无论如何都不会被接受。对于以下示例(5 3 10 5 1 9 9),您的代码将返回 1,但必须为 0

标签: c++ algorithm optimization vector stl


【解决方案1】:

目前,每一步都需要用O(dlogd)时间排序,所以总时间大约是O(ndlogd)

您必须尽量减少中位数的时间。有一种使用最小和最大堆 (example) 的方法来处理当前时刻的所有数据。中位数是奇数d 的较大堆上的元素,偶数d 是两个堆顶部的平均值。

但您需要滚动窗口中的中位数。所以可能的补充:使用指向堆节点的引用/指针制作并行数据结构ref[](以循环方式工作的列表/数组)。当索引离开窗口(大小为d)时,从堆中删除相应的节点,然后添加具有新值的新节点并更新堆和ref

每一步只需要O(logd)时间

更新:似乎this topic 包含很多rolling window median 方法的链接和描述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多