【问题标题】:hackerrank solution in c for "Array Manipulation"c 中针对“数组操作”的hackerrank 解决方案
【发布时间】:2020-11-15 00:51:13
【问题描述】:
long arrayManipulation(int n, int queries_rows, int queries_columns, int** queries)
{
    long num, a, b, maxnum = INT_MIN;
    long* arrptr = calloc(n, sizeof(long));
    for(int i = 0;i<(queries_rows);i++)
    {
      num = queries[i][2];
      if(num==0)
      {
          continue;
      }
      printf("%ld ", num);
      a = queries[i][0];
      b = queries[i][1];
      for(long i = a-1;i<b;i++)
      {
        arrptr[i] += num;
        if(maxnum<(arrptr[i]))
        {
            maxnum = arrptr[i];
        }
      }
  }
  free(arrptr);
  return maxnum;
}

我必须优化这个程序,以便它可以在更短的时间内执行,你能帮忙吗??

这个程序应该用 0 初始化一个大小为 n(函数参数)的数组(让我们调用数组 arr) 那么会有表单查询
a b k
1 2 3
4 5 6

然后在数组 arr 中我们在限制 a 和 b 之间添加 k 然后返回 arr 的最大值

示例 样本输入

5 3
1 2 100
2 5 100
3 4 100

样本输出

200

解释

第一次更新后列表将是 100 100 0 0 0。
第二次更新后列表将是 100 200 100 100 100。
第三次更新后列表将是 100 200 200 200 100。
返回的答案将是 200。

【问题讨论】:

  • @4386427 我纠正了它,现在唯一的问题是我必须减少时间,int* arrptr 的错误只是一个打字错误,谢谢
  • 帮自己(以及阅读您代码的每个人)一个忙,并在通过指针使用值时使用数组索引,例如:num = *(*(queries+i)+2); 相当于 num = queries[i][2];
  • @pmg 我们可以使用这样的数组指针吗?很抱歉问了这样一个愚蠢的问题??????????。
  • 是的,您可以使用这样的指针。编译后的代码很可能与您使用的任何语法相同。您可能想阅读comp.lang.c faq 的第 6 部分。
  • 可能不是“超出时间限制”的原因,但是您可以直接从输入进行更新而不将所有内容放入数组中(只保留数据数组)吗?

标签: arrays c algorithm


【解决方案1】:

实际上,你可以想出一个更好的算法,它可以在 O(n) 中完成这项工作,而不是在 O(n*n) 中完成你正在做的事情。

所以算法是这样的

1-初始化大小为 n+1 的数组,其中包含所有的 0

2-对于每个查询L,R,X,array[L]增加X的值,array[R+1]的值减少X

最后一步是获取数组的前缀总和,这将为您提供最终处理的数组,您可以在其中找到最大值并作为答案返回。

例如。 5 3 arr=[0,0,0,0,0,0]

第 1 步: 1 2 100 arr=[100 0 -100 0 0 0]

第 2 步: 2 5 100 arr=[100 100 -100 0 0 -100]

第 3 步: 3 4 100 arr=[100 100 0 0 -100 -100]

第 4 步: 前缀和 arr=[100 200 200 200 100 0] -> 这是你的最终数组,然后你可以轻松地从这个数组中返回最大值

希望这会有所帮助!如果你有什么不明白的地方告诉我,我很乐意提供帮助

【讨论】:

    【解决方案2】:

    由于我一直在研究它,我发现了一个很好且易于理解的代码,它采用 O(n) 方法,它在所需的时间内运行良好并且没有错误。

    long arrayManipulation(int n, int queries_rows, int queries_columns, int** queries) 
    {
      long num, a, b, maxnum = INT_MIN;
      int* arrptr = calloc(n, sizeof(long));
      for(int i=0;i<queries_rows;i++)
      {
       arrptr[queries[i][0] -1] +=queries[i][2];
       arrptr[queries[i][1]] -= queries[i][2];
      }
       long count = 0; 
      for(int i=0;i<n;i++)
      {
       count += arrptr[i];
       arrptr[i]=count;
          if(count>maxnum) maxnum=count;
      }
           printf("%ld\n",maxnum);
      free(arrptr);
      return maxnum;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多