查找最长的双音序列,以便增加和减少部分来自Python中的两个不同数组
假设我们有两个数组;我们必须找到最长的双音序列,以便增加的部分应该来自第一个数组,并且应该是第一个数组的子序列。同样,的递减部分必须来自第二个数组和第二个数组的子序列。
因此,如果输入像A=[2、6、3、5、4、6],B=[9、7、5、8、4、3],那么输出将为[2、3、4,6,9,7,5,4,3]
为了解决这个问题,我们将遵循以下步骤-
定义一个函数index_ceiling()。这将需要arr,T,左,右,键
而右-左>1,则
左:=中
右:=中
中:=左+(右-左)/2;
如果arr[T[mid]]>=键,则
除此以外,
归还权利
定义一个函数long_inc_seq()。这需要一个
n:=A的大小
tails_idx:=大小为n的数组,用0填充
prev_idx:=大小为n的数组,用-1填充
长度:=1
对于1到n范围内的i,执行
pos:=index_ceiling(A,tails_idx,-1,长度-1,A[i])
prev_idx[i]:=tails_idx[pos-1]
tails_idx[pos]:=i
prev_idx[i]:=tails_idx[length-1]
tails_idx[length]:=i
长度:=长度+1
tails_idx[0]:=i
如果A[i]<A[tails_idx[0]],则
否则,当A[i]>A[tails_idx[length-1]]时,则
除此以外,
i:=tails_idx[length-1]
当我>=0时
在答案的末尾插入A[i]
i:=prev_idx[i]
从主要方法中,执行以下操作-
n1:=A的大小,n2:=B的大小
long_inc_seq(A)
答案:=反向答案
B:=反向B
long_inc_seq(B)
返回答案
示例
让我们看下面的实现以更好地理解-
answer = []
def index_ceiling(arr,T, left,right, key):
while (right - left > 1):
mid = left + (right - left) // 2;
if (arr[T[mid]] >= key):
right = mid
else:
left = mid
return right
def long_inc_seq(A):
n = len(A)
tails_idx = [0]*(n)
prev_idx = [-1]*(n)
length = 1
for i in range(1, n):
if (A[i] < A[tails_idx[0]]):
tails_idx[0] = i
elif (A[i] > A[tails_idx[length - 1]]):
prev_idx[i] = tails_idx[length - 1]
tails_idx[length] = i
length += 1
else:
pos = index_ceiling(A, tails_idx, -1, length - 1, A[i])
prev_idx[i] = tails_idx[pos - 1]
tails_idx[pos] = i
i = tails_idx[length - 1]
while(i >= 0):
answer.append(A[i])
i = prev_idx[i]
def long_bitonic(A,B):
n1 = len(A)
n2 = len(B)
global answer
long_inc_seq(A)
answer = answer[::-1]
B = B[::-1]
long_inc_seq(B)
A = [2, 6, 3, 5, 4, 6]
B = [9, 7, 5, 8, 4, 3]
long_bitonic(A,B)
print(answer)输入值
[2, 6, 3, 5, 4, 6], [9, 7, 5, 8, 4, 3]
输出结果
[2, 3, 4, 6, 9, 7, 5, 4, 3]