给定两个长度为M和N的数组arr1 []和arr2 [] ,该数组由代表两个数字的数字[ 0,9]和一个整数K ( K≤M + N )组成,任务是找到可能的最大K位数字通过从给定数组中选择子序列,以使数字的相对顺序与给定数组中的顺序相同。
例子:
Input: arr1[] = {3, 4, 6, 5}, arr2[] = {9, 1, 2, 5, 8, 3}, K = 5
Output: 98653
Explanation: The maximum number that can be formed out of the given arrays arr1[] and arr2[] of length K is 98653.
Input: arr1[] = {6, 7}, arr2[] = {6, 0, 4}, K = 5
Output: 67604
Explanation: The maximum number that can be formed out of the given arrays arr1[] and arr2[] of length K is 67604.
天真的方法:这个想法是从arr1 []生成长度为s1的所有子序列,并从数组arr2 []生成长度为[0,K]的s1的所有子序列(K – s1) ,并跟踪通过在每次迭代中合并两个数组而形成的最大数量。
时间复杂度: O(2 N )
辅助空间: O(1)
高效方法:为了优化上述方法,我们的想法是从数组arr1 []和长度为s1的最大值中获取最大数,并从数组arr2 []和长度为(K – s1)的数组中获取最大数。然后,合并两个数组以获得最大长度K。请按照以下步骤解决给定的问题:
- 使用变量i在范围[0,K]上进行迭代,并生成所有可能的长度为i的递减子序列,并保留与数组arr1 []相同的顺序,并保留长度(K – i)的子序列,与数组中的顺序相同arr2 [] 。
- 为了在上述步骤中生成任何数组arr []的长度L的递减子序列,请执行以下操作:
- 初始化数组ans []以存储长度为L的子序列,并保留与arr []中相同的顺序,然后遍历数组arr []并执行以下操作:
- 直到最后一个元素小于当前元素,然后从数组ans []中删除最后一个元素。
- 如果ans []的长度小于L,则将当前元素插入ans [] 。
- 完成上述步骤后,结果子序列中的数组ans []。
- 初始化数组ans []以存储长度为L的子序列,并保留与arr []中相同的顺序,然后遍历数组arr []并执行以下操作:
- 同时使用在步骤2中讨论的方法产生在步骤1中所有可能长度的子序列通过合并所形成的两个子信号串产生的最大数量。
- 完成上述步骤后,打印合并后给出最大数量的子序列。
下面是上述方法的实现:
Python3
# Python program for the above approach
# Function to find maximum K-digit number
# possible from subsequences of the
# two arrays nums1[] and nums2[]
def maxNumber(nums1, nums2, k):
# Store lengths of the arrays
l1, l2 = len(nums1), len(nums2)
# Store the resultant subsequence
rs = []
# Function to calculate maximum
# number from nums of length c_len
def helper(nums, c_len):
# Store the resultant maximum
ans = []
# Length of the nums array
ln = len(nums)
# Traverse the nums array
for idx, val in enumerate(nums):
while ans and ans[-1] < val and ln-idx > c_len-len(ans):
# If true, then pop
# out the last element
ans.pop(-1)
# Check the length with
# required length
if len(ans) < c_len:
# Append the value to ans
ans.append(val)
# Return the ans
return ans
# Traverse and pick the maximum
for s1 in range(max(0, k-l2), min(k, l1)+1):
# p1 and p2 stores maximum number possible
# of length s1 and k - s1 from
# the arrays nums1[] & nums2[]
p1, p2 = helper(nums1, s1), helper(nums2, k-s1)
# Update the maximum number
rs = max(rs, [max(p1, p2).pop(0) for _ in range(k)])
# Return the result
return rs
# Driver Code
arr1 = [3, 4, 6, 5]
arr2 = [9, 1, 2, 5, 8, 3]
K = 5
# Function Call
print(maxNumber(arr1, arr2, K))
[9, 8, 6, 5, 3]
时间复杂度: O(K *(M + N))
辅助空间: O(K)