在Python中找到线性时间中大小为3的排序子序列
假设我们有一个N个数字的数组,我们必须检查3个元素是否在线性(O(n))时间内b[i]<b[j]<b[k]和i<j<k。如果有多个这样的三胞胎,则打印其中任何一个。
因此,如果输入类似于[13,12,11,6,6,7,3,31],那么输出将为[6,7,31]
为了解决这个问题,我们将遵循以下步骤-
n:=A的大小
最大值:=n-1,最小值:=0
更小:=大小为1000的数组,并用0填充
较小[0]:=-1
对于1到n范围内的i,执行
更小[i]:=最小值
最低:=我
小[i]:=-1
如果A[i]<=A[最小值],则
除此以外,
更大:=大小为1000的数组,并用0填充
更大[n-1]:=-1
对于范围在n-2到-1之间的i,将其减小1,
更大[i]:=最大值
最大:=我
更大[i]:=-1
如果A[i]>=A[最大],则
除此以外,
对于0到n范围内的i,执行
返回A[smaller[i]],A[i],A[greater[i]]
如果更小[i]与-1不相同,而更大[i]与-1不相同,则
返回“无”
示例
让我们看下面的实现以更好地理解-
def find_inc_seq(A):
n = len(A)
maximum = n-1
minimum = 0
smaller = [0]*10000
smaller[0] = -1
for i in range(1, n):
if (A[i] <= A[minimum]):
minimum = i
smaller[i] = -1
else:
smaller[i] = minimum
greater = [0]*10000
greater[n-1] = -1
for i in range(n-2, -1, -1):
if (A[i] >= A[maximum]):
maximum = i
greater[i] = -1
else:
greater[i] = maximum
for i in range(0, n):
if smaller[i] != -1 and greater[i] != -1:
return A[smaller[i]], A[i], A[greater[i]]
return "Nothing"
arr = [13, 12, 11, 6, 7, 3, 31]
print(find_inc_seq(arr) )输入值
[13, 12, 11, 6, 7, 3, 31]
输出结果
(6, 7, 31)