Número máximo de dígitos K posible a partir de subsecuencias de dos arrays dadas

Dadas dos arrays arr1[] y arr2[] de longitud M y N que consisten en dígitos [0, 9] que representan dos números y un número entero K ( K ≤ M + N ), la tarea es encontrar el número máximo de K dígitos posible seleccionando subsecuencias de las arrays dadas de modo que el orden relativo de los dígitos sea el mismo que en la array dada.

Ejemplos:

Entrada: arr1[] = {3, 4, 6, 5}, arr2[] = {9, 1, 2, 5, 8, 3}, K = 5
Salida: 98653
Explicación: El número máximo que se puede formar de las arrays dadas arr1[] y arr2[] de longitud K es 98653.

Entrada: arr1[] = {6, 7}, arr2[] = {6, 0, 4}, K = 5
Salida: 67604
Explicación: El número máximo que se puede formar a partir de las arrays dadas arr1[] y arr2[ ] de longitud K es 67604.

Enfoque ingenuo: la idea es generar todas las subsecuencias de longitud s1 de arr1[] y todas las subsecuencias de longitud (K – s1) de la array arr2[] sobre todos los valores de s1 en el rango [0, K] y realizar un seguimiento de el número máximo así formado al fusionar ambas arrays en cada iteración.

Complejidad temporal: O(2 N )
Espacio auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea es obtener el número máximo de la array arr1[] y de longitud s1 y el número máximo de la array arr2[] y de longitud (K – s1) . Luego, combine las dos arrays para obtener el número máximo de longitud K . Siga los pasos a continuación para resolver el problema dado:

  1. Iterar sobre el rango [0, K] usando la variable i y generar todas las posibles subsecuencias decrecientes de longitud i conservando el mismo orden que en la array arr1[] y las subsecuencias de longitud (K – i) siguiendo el mismo orden que en la array arr2[] .
  2. Para generar una subsecuencia decreciente de longitud L de cualquier array arr[] en el paso anterior, haga lo siguiente:
    • Inicialice una array ans[] para almacenar las subsecuencias de longitud L conservando el mismo orden que en arr[]  y recorra la array arr[] y haga lo siguiente:
      • Hasta que el último elemento sea menor que el elemento actual, elimine el último elemento de la array ans[] .
      • Si la longitud de ans[] es menor que L , inserte el elemento actual en ans[] .
    • Después de los pasos anteriores, la array ans[] en la subsecuencia resultante.
  3. Mientras genera las subsecuencias de toda la longitud posible en el Paso 1 utilizando el enfoque discutido en el Paso 2 , genere el número máximo fusionando las dos subsecuencias formadas.
  4. Después de los pasos anteriores, imprima esa subsecuencia que da el número máximo después de la fusión.
     

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
void pop_front(std::vector<int> &v)
{
    if (v.size() > 0) {
        v.erase(v.begin());
    }
}
// Function to calculate maximum
// number from nums of length c_len
vector<int> helper(vector<int> nums, int c_len)
{
    // Store the resultant maximum
    vector<int> ans;
    // Length of the nums array
    int ln = nums.size();
    // Traverse the nums array
    for(int i=0;i<ln;i++)
    {
        while(ans.size()>0 && ans.back()<nums[i] && ((ln-i) > (c_len-ans.size())))
        // If true, then pop
        // out the last element
        ans.pop_back();
         
        // Check the length with
        // required length
        if(ans.size()<c_len)
        // Append the value to ans
        ans.push_back(nums[i]);
    }
    // Return the ans
    return ans;
}
 
// Function to find maximum K-digit number
// possible from subsequences of the
// two arrays nums1[] and nums2[]
vector<int> maxNumber(vector<int> nums1, vector<int> nums2,int k)
{
    // Store lengths of the arrays
    int l1 = nums1.size();
    int l2 = nums2.size();
     
    // Store the resultant subsequence
    vector<int> rs;
     
    // Traverse and pick the maximum
    for(int s1=max(0, k-l2);s1<=min(k, l1);s1++)
    {
        // p1 and p2 stores maximum number possible
        // of length s1 and k - s1 from
        // the arrays nums1[] & nums2[]
        vector<int> p1,p2;
        p1 = helper(nums1, s1);
        p2 = helper(nums2, k-s1);
         
        // Update the maximum number
        vector<int> temp;
        for(int j=0;j<k;j++)
        { 
            vector<int> temp2 = max(p1,p2);
            int fr = temp2.front();
            if(p1>p2)
            pop_front(p1);
            else
            pop_front(p2);
            temp.push_back(fr);
        }
         
        rs = max(rs, temp);
         
    }
    // Return the result
    return rs;
}
 
// Driver Code
int main()
{
    vector<int> arr1{3, 4, 6, 5};
    vector<int> arr2{9, 1, 2, 5, 8, 3};
    int K=5;
    //  Function Call
    vector<int> v = maxNumber(arr1, arr2, K);
    for(int i=0;i<v.size();i++)
    cout<<v[i]<<" ";
    return 0;
}
 
// This code is contributed by Pushpesh Raj

Java

import java.util.*;
import java.io.*;
 
// Java program for the above approach
class GFG{
 
    // Function to calculate maximum
    // number from nums of length c_len
    static ArrayList<Integer> helper(ArrayList<Integer> nums, int c_len)
    {
        // Store the resultant maximum
        ArrayList<Integer> ans = new ArrayList<Integer>();
       
        // Length of the nums array
        int ln = nums.size();
       
        // Traverse the nums array
        for(int i = 0 ; i < ln ; i++)
        {  
            while(ans.size() > 0 && ans.get(ans.size() - 1) < nums.get(i) && ((ln-i) > (c_len - ans.size()))){
                // If true, then pop
                // out the last element
                ans.remove(ans.size() - 1);
            }
             
            // Check the length with
            // required length
            if(ans.size() < c_len){
                // Append the value to ans
                ans.add(nums.get(i));
            }
        }
        // Return the ans
        return ans;
    }
 
    // Returns True if a1 is greater than a2
    static boolean comp(ArrayList<Integer> a1, ArrayList<Integer> a2){
        int s1 = a1.size();
        int s2 = a2.size();
 
        int i1 = 0, i2 = 0;
        while(i1 < s1 && i2 < s2){
            if(a1.get(i1) > a2.get(i2)){
                return true;
            }else if(a1.get(i1) < a2.get(i2)){
                return false;
            }
            i1++;
            i2++;
        }
        if(i1 < s1) return true;
        return false;
    }
 
    // Function to find maximum K-digit number
    // possible from subsequences of the
    // two arrays nums1[] and nums2[]
    static ArrayList<Integer> maxNumber(ArrayList<Integer> nums1, ArrayList<Integer> nums2,int k)
    {
        // Store lengths of the arrays
        int l1 = nums1.size();
        int l2 = nums2.size();
         
        // Store the resultant subsequence
        ArrayList<Integer> rs = new ArrayList<Integer>();
         
        // Traverse and pick the maximum
        for(int s1 = Math.max(0, k-l2) ; s1 <= Math.min(k, l1) ; s1++)
        {
            // p1 and p2 stores maximum number possible
            // of length s1 and k - s1 from
            // the arrays nums1[] & nums2[]
            ArrayList<Integer> p1 = new ArrayList<Integer>();
            ArrayList<Integer> p2 = new ArrayList<Integer>();
 
            p1 = helper(nums1, s1);
            p2 = helper(nums2, k-s1);
             
            // Update the maximum number
            ArrayList<Integer> temp = new ArrayList<Integer>();
            for(int j = 0 ; j < k ; j++)
            {
                ArrayList<Integer> temp2 = comp(p1, p2) ? p1 : p2;
                int fr = temp2.get(0);
                if(comp(p1, p2)){
                    if(p1.size() > 0){
                        p1.remove(0);
                    }
                }else{
                    if(p2.size() > 0){
                        p2.remove(0);
                    }
                }
                temp.add(fr);
            }
             
            rs = comp(rs, temp) ? rs : temp;
             
        }
        // Return the result
        return rs;
    }
     
 
    public static void main(String args[])
    {
        ArrayList<Integer> arr1 = new ArrayList<Integer>(
            List.of(
                3, 4, 6, 5
            )
        );
        ArrayList<Integer> arr2 = new ArrayList<Integer>(
            List.of(
                9, 1, 2, 5, 8, 3
            )
        );
        int K = 5;
       
        // Function Call
        ArrayList<Integer> v = maxNumber(arr1, arr2, K);
        for(int i = 0 ; i < v.size() ; i++){
            System.out.print(v.get(i) + " ");
        }
    }
}
 
// This code is contributed by subhamgoyal2014.

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))
Producción:

[9, 8, 6, 5, 3]

Complejidad temporal: O(K*(M + N))
Espacio auxiliar: O(K)

Publicación traducida automáticamente

Artículo escrito por saikumarkudikala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *