【问题标题】:Find nearest by index numbers in array less than number at given index在数组中查找最近的索引号小于给定索引处的数字
【发布时间】:2013-04-15 16:53:57
【问题描述】:

这是一个算法优化问题。

我有一个整数数组 A 并且想要构建数组 B 使得 B[i] 包含 A[j] 中元素的索引 j 使得 (B[i] = j)

1. j > i
2. A[j] < A[i]
3. j is minimum of all possible j's.

例如,如果A 是:

   A = [1,5,6,4,3,1,2]

然后B 将是(从 0 开始索引)

   B = [-1,3,3,4,5,-1,-1]

B[0] = -1,因为没有小于1 且索引大于0 的数字。 B[1] = 3 因为A[3] 是在A 中索引1 的最右边的元素,其中包含的数字小于A[1]=5。以此类推。

我知道使用二叉搜索树具有O(n*log(n)) 复杂性的解决方案。如何将复杂度提高到O(n) 或证明不可能?

【问题讨论】:

  • 再次检查,b[1]不等于2,因为a[2] = 6 > 5 = a[1]

标签: algorithm optimization complexity-theory


【解决方案1】:

除非我误解了这个问题,否则您可以通过简单的从左到右扫描来解决它,保留一堆您尚未遇到较小元素的索引。 (出于显而易见的原因,与堆栈上的索引对应的值必须是单调非递减的。)

对于输入列表中的每个值,当该值小于堆栈顶部索引(如果有)对应的值时,将输出列表的对应元素设置为当前输入值的索引并弹出堆栈。

以下 Python 小程序说明:

def ind(a):
  b = [-1] * len(a)
  stack = []
  for i in range(len(a)):
    v = a[i]
    while stack and a[stack[-1]] > v:
      j = stack.pop()
      b[j] = i
    stack.append(i)
  return b

证明是O(n):for 循环显然执行了n 次。 while 循环的主体最多执行(总共)n 次,因为它对于每个元素只能发生一次。或者,换句话说,每个元素最多被推送和弹出一次。

【讨论】:

  • 您没有误会,一切正常,谢谢!我完全忘记了我可以使用堆栈
猜你喜欢
  • 2018-06-05
  • 2013-11-02
  • 2021-11-06
  • 2021-10-15
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2017-08-13
相关资源
最近更新 更多