📅  最后修改于: 2023-12-03 15:10:51.628000             🧑  作者: Mango
给定两个排序数组,判断是否可以合并形成一个排序数组,合并后的数组中不存在来自同一数组的相邻对。
输入:
arr1 = [1,3,5,7]
arr2 = [2,4,6,8]
输出:
True
解释:
合并后的数组为 [1, 2, 3, 4, 5, 6, 7, 8],其中没有来自同一数组的相邻对。
输入:
arr1 = [1,3,5,7]
arr2 = [2,4,6,8,9]
输出:
False
解释:
合并后的数组为 [1, 2, 3, 4, 5, 6, 7, 8, 9],其中有来自同一数组的相邻对 [8, 9]。
首先考虑暴力枚举的方法,对于两个数组中的每一对相邻元素进行比较,如果它们来自同一个数组且相邻,则返回 False,否则返回 True。
def check_merge(arr1, arr2):
n1, n2 = len(arr1), len(arr2)
for i in range(n1 - 1):
if arr1[i] == arr1[i + 1]:
return False
for i in range(n2 - 1):
if arr2[i] == arr2[i + 1]:
return False
for i in range(n1):
for j in range(n2):
if arr1[i] < arr2[j]:
if i + 1 < n1 and arr2[j] < arr1[i + 1]:
if j + 1 < n2 and arr1[i] < arr2[j + 1]:
return False
elif j + 1 < n2 and arr1[i] < arr2[j + 1]:
if i + 1 < n1 and arr2[j] < arr1[i + 1]:
return False
else:
if j + 1 < n2 and arr1[i] > arr2[j + 1]:
if i + 1 < n1 and arr2[j] > arr1[i + 1]:
return False
elif i + 1 < n1 and arr2[j] > arr1[i + 1]:
if j + 1 < n2 and arr1[i] > arr2[j + 1]:
return False
return True
假设数组1的长度为n1,数组2的长度为n2。
从两个数组的开头开始比较,每次取较小的元素并加入结果数组中,然后递归比较剩下的部分。
def check_merge(arr1, arr2):
n1, n2 = len(arr1), len(arr2)
if n1 > n2:
return check_merge(arr2, arr1)
if n1 == 0:
for i in range(n2 - 1):
if arr2[i] == arr2[i + 1]:
return False
return True
for i in range(1, n1):
if arr1[i] == arr1[i - 1]:
return False
if arr1[-1] == arr2[0]:
return False
for i in range(n1):
j = bisect.bisect_right(arr2, arr1[i], lo=i + 1)
if j < n2 and arr2[j] == arr1[i]:
return False
return check_merge(arr2[n1:], arr1)
假设数组1的长度为n1,数组2的长度为n2。