在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)