📌  相关文章
📜  来自两个给定数组的子序列的最大K位数字

📅  最后修改于: 2021-05-17 23:31:50             🧑  作者: Mango

给定两个长度为MN的数组arr1 []arr2 [] ,该数组由代表两个数字的数字[ 0,9]和一个整数K ( K≤M + N )组成,任务是找到可能的最大K位数字通过从给定数组中选择子序列,以使数字的相对顺序与给定数组中的顺序相同。

例子:

天真的方法:这个想法是从arr1 []生成长度为s1的所有子序列,并从数组arr2 []生成长度为[0,K]s1的所有子序列(K – s1) ,并跟踪通过在每次迭代中合并两个数组而形成的最大数量。

时间复杂度: O(2 N )
辅助空间: O(1)

高效方法:为了优化上述方法,我们的想法是从数组arr1 []和长度为s1的最大值中获取最大数,并从数组arr2 []和长度为(K – s1)的数组中获取最大数。然后,合并两个数组以获得最大长度K。请按照以下步骤解决给定的问题:

  1. 使用变量i在范围[0,K]上进行迭代,并生成所有可能的长度为i的递减子序列,并保留与数组arr1 []相同的顺序,并保留长度(K – i)的子序列,与数组中的顺序相同arr2 []
  2. 为了在上述步骤中生成任何数组arr []的长度L的递减子序列,请执行以下操作:
    • 初始化数组ans []以存储长度为L的子序列,并保留与arr []中相同的顺序,然后遍历数组arr []并执行以下操作:
      • 直到最后一个元素小于当前元素,然后从数组ans []中删除最后一个元素。
      • 如果ans []的长度小于L,则将当前元素插入ans []
    • 完成上述步骤后,结果子序列中的数组ans []。
  3. 同时使用在步骤2中讨论的方法产生在步骤1中所有可能长度的子序列通过合并所形成的两个子信号串产生的最大数量。
  4. 完成上述步骤后,打印合并后给出最大数量的子序列。

下面是上述方法的实现:

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)