【问题标题】:Count Subsequences with absolute difference of first and last element smaller <= K计算第一个和最后一个元素的绝对差小于<= K的子序列
【发布时间】:2019-05-11 05:05:56
【问题描述】:

我在黑客马拉松中遇到了这个问题,但不知道我哪里出错了。

问题陈述是

Count the number of subsequences in an array where the difference of the first and last element is <= K

Each subsequence is contiguous

Input: 11 5 2 15 25
Output: 6

Explanation: {11}, {5}, {2}, {15}, {25}, {5, 2}

我相信他们正在考虑将单个元素作为有效的子序列,所以 我试图返回数组的长度 + 计数。

int getCount(int *a, int n, int k){
   sort(a, a + n);
   int c = 0;
   for(int i=0; i<n; i++){
       int j = i + 1;
       while(j < n and a[j] - a[i] <= k){
           c+=1;
           j+=1;
       }
   }
   return n + c;
}

我尝试过排序,但仍然超时!

【问题讨论】:

  • 为什么要对输入进行排序?有必要吗?
  • 实际上我之前在 geeksforgeeks 上做过一个类似的问题,他们提出了一个关于排序的策略。 geeksforgeeks.org/pairs-difference-less-k

标签: c++ arrays subsequence


【解决方案1】:

我在这里看到的复杂性没有任何问题,它应该是 O(n*n) 但当然它会超时,因为这是一个无限循环:

while(j < n and a[j] - a[i] <= k) c += 1;

修复:

while(j++ < n and a[j] - a[i] <= k) c += 1;

while(j < n and a[j] - a[i] <= k) {
   c += 1;
   j++;
}

此外,您可能希望将比较从较低或等于更改为较低

决赛:

while(j < n and a[j] - a[i] < k) {
   c += 1;
   j++;
}

干杯!

【讨论】:

  • 感谢您指出这一点,但实际上我做了同样的事情。对不起那个错字。它仍然显示错误的答案。我已经编辑了该代码。
  • 超时和错误答案。我首先尝试使用 Java,它显示 TLE,当我切换到 C++ 时,它显示 5/10 案例的错误答案
【解决方案2】:

您正在使用 O(nn) 方法而不是使用 O(nlogn) 方法来克服 TLE 问题,因此您已经对数组进行了排序,因此只需对每个元素应用二进制搜索即可找到最大距离元素差异小于或等于 k,因此它适用于 O(nlogn); 因此解决了! 谢谢!!!

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2022-12-13
    相关资源
    最近更新 更多