找到数组的忍者索引

h4c*_*k3d 8 language-agnostic arrays algorithm

这是我遇到的一个有趣的难题,根据该难题,给定一个数组,我们需要在其中找到忍者索引.

忍者指数由以下规则定义:

索引K使得具有较小索引的所有元素具有低于或等于A [K]的值,并且具有较大索引的所有元素具有大于或等于A [K]的值.

例如,考虑:

A[0]=4, A[1]=2, A[2]=2, A[3]=3, A[4]=1, A[5]=4, A[6]=7, A[7]=8, A[8]=6, A[9]=9.

在这种情况下,5是忍者指数,因为对于r = [0,k]和A [5] <= A [r] r = [k,n],A [r] <= A [5].

我们应该遵循什么算法才能在O(n)中找到它.我已经有一个强力O(n ^ 2)解决方案.

编辑:可能有超过1个忍者指数,但我们需要优先找到第一个.如果没有NI,那么我们将返回-1.

Raf*_*ird 8

预计算阵列所有后缀的最小值和所有前缀的最大值.使用此数据,可以在O(1)中检查Ninja中的每个元素.

  • @sTEAK.:后缀最小值数组:`min = {1,1,1,1,1,4,6,6,6,9}`,前缀最大值数组:`max = {4,4,4,4, 4,4,7,8,8,9}`.检查索引`i`,使得'A [i] <min [i + 1]`和'A [i]> max [i-1]`.对于`i == 5`我们得到'A [5] = 4,max [4] = 4,min [6] = 6` - 它满足条件 (6认同)