【问题标题】:Find number of ranges (a[i], a[i+1]) which contains the value k for i in range a, b查找范围数 (a[i], a[i+1]),其中包含范围 a, b 中 i 的值 k
【发布时间】:2020-06-21 13:05:57
【问题描述】:

给定一个包含 n 个元素的数组,我如何找到范围数 [min(A[i], A[i+1]), max(A[i], A[i+1])]包含给定值 k。对于从零开始的索引,这里 i 介于 0

例如,对于下面的数组,a = 1,b = 3;

6 3 2 8 5

假设 k = 3,它必须在 [min(A[1], A[2]), max(A[1], A[2])] 和 [min(A[2] ], A[3]), 最大(A[2], A[3])]。这里 k=3 出现在 [2, 3] 和 [2, 8] 范围内,所以答案是 2。

如何通过某些预计算在小于线性时间内找到范围计数?

我不需要确切的代码,只需对方法/数据结构进行高级概述即可。

提前致谢!

【问题讨论】:

  • 这里 i 位于 a 不是0 <= i <= n-1 吗? ab 是什么?
  • 我不明白i lies between a < b < n -- a 是一个数组,而不是一个整数。而b 未知?
  • 抱歉A是数组,更新问题
  • 仍然,a 和 b 是什么?
  • 搜索“如何遍历数组 c++”和“如何比较两个元素 c++”和“如何比较一个元素与其他两个元素 c++”

标签: c++ algorithm data-structures


【解决方案1】:

您可以通过先前踢出数组 A 中的所有元素 i 来节省一些时间,这些元素填充了(A[i-1] <= A[i] and A[i] <= A[i+1]) or ((A[i-1] >= A[i] and A[i] >= A[i+1])。那么计算有效区间范围号应该还是一样的。

int ctr = 0; 
for(i=a;i<b-1;i++) 
{ 
  if ( (A[i]<=k && A[i+1]>= k) ||  (A[i]>=k && A[i+1]<= k) ) 
    ctr++; 
} 
printf(" Count: %i", ctr); 

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多