Maximizar el producto de la diferencia de índice absoluto con K

Dada una array A[] que consta de N enteros, la tarea es encontrar el valor máximo posible de K , tal que K * |i – j| <= min(A i , A j ) , donde (0 ? i < j < N). 

Dada la expresión, k * |i – j| <= min(A i , A j ) también se puede escribir como k = piso( min(A i , A j ) / |i – j| )

Ejemplos:  

Entrada: N = 5, A[ ] = {80, 10, 12, 15, 90} 
Salida: 20 
Explicación: 
Para i = 0 y j = 4, se puede obtener el máximo valor posible de K. 
Máximo k = min(A[0], A[4]) / |0 – 4| = min(80, 90) / |-4| = 80/4 = 20

Entrada: N = 5, A[ ] = {10, 5, 12, 15, 8} 
Salida: 12 
Explicación: 
Para i = 2 y j = 3, se puede obtener el máximo valor posible de K. 
Máximo k = min(A[2], A[3]) / |2 – 3| = min(12, 15) / |-1| = 12/1 = 12 

Enfoque ingenuo: 
el enfoque más simple para resolver este problema es generar todos los pares posibles a partir de la array dada y, para cada par, encontrar el valor de K y seguir actualizando el máximo K obtenido. Finalmente, imprima el valor máximo de K obtenido. 
Complejidad de Tiempo: O(N 2 )  
Espacio Auxiliar: O(1)

Enfoque eficiente: 
para optimizar el enfoque anterior, utilice la técnica de dos punteros . Siga los pasos que se indican a continuación: 

  • Inicialice tres variables i , j y k . Establezca inicialmente i = 0 yk = 0 .
  • Iterar sobre la array, desde j = 1 hasta j = N-1 .
  • Ahora, para cada par de A[i] y A[j] , encuentre min(A[i], A[j]) / ( j – i ). Si es mayor que K , actualice K .
  • Si A[ j ] >= A[i] / ( j – i ) , entonces actualice el puntero i a j , para asegurarse de que entre todos los elementos hasta i , A[i] resulte en un máximo de K con todos los próximos A[ j]
  • Finalmente, imprima el valor máximo de K después de que la array se atraviese por completo.

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

C++

// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function returns maximum
// possible value of k
int solve(int A[], int N)
{
 
    // Pointer i make sure that
    // A[i] will result in max k
    int i = 0;
 
    // Stores maximum possible k
    int k = 0;
 
    for (int j = 1; j < N; j++) {
 
        // Possible value of k for
        // current pair (A[i] and A[j])
        int tempK = min(A[i], A[j])
                    / (j - i);
 
        // If current value exceeds k
        if (tempK > k) {
            // Update the value of k
            k = tempK;
        }
 
        // Update pointer i
        if (A[j] >= A[i] / (j - i))
            i = j;
    }
 
    // Return the maxm possible k
    return k;
}
 
// Driver Code
int main()
{
    int A[] = { 10, 5, 12, 15, 8 };
 
    int N = sizeof(A) / sizeof(A[0]);
 
    cout << solve(A, N);
 
    return 0;
}

Java

// Java program to implement
// the above approach
class GFG{
 
// Function returns maximum
// possible value of k
static int solve(int A[], int N)
{
     
    // Pointer i make sure that
    // A[i] will result in max k
    int i = 0;
 
    // Stores maximum possible k
    int k = 0;
 
    for(int j = 1; j < N; j++)
    {
         
        // Possible value of k for
        // current pair (A[i] and A[j])
        int tempK = Math.min(A[i], A[j]) /
                              (j - i);
 
        // If current value exceeds k
        if (tempK > k)
        {
             
            // Update the value of k
            k = tempK;
        }
 
        // Update pointer i
        if (A[j] >= A[i] / (j - i))
            i = j;
    }
 
    // Return the maxm possible k
    return k;
}
 
// Driver Code
public static void main(String[] args)
{
    int A[] = { 10, 5, 12, 15, 8 };
    int N = A.length;
     
    System.out.println(solve(A, N));
}
}
 
// This code is contributed by rutvik_56

Python3

# Python3 program to implement
# the above approach
 
# Function returns maximum
# possible value of k
def solve(A, N):
 
    # Pointer i make sure that
    # A[i] will result in max k
    i = 0
 
    # Stores maximum possible k
    k = 0
 
    for j in range(1, N):
 
        # Possible value of k for
        # current pair (A[i] and A[j])
        tempK = (min(A[i], A[j]) // (j - i))
                     
        # If current value exceeds k
        if (tempK > k):
             
            # Update the value of k
            k = tempK
         
        # Update pointer i
        if (A[j] >= A[i] // (j - i)):
            i = j
 
    # Return the maxm possible k
    return k
 
# Driver Code
if __name__ == "__main__":
     
    A = [ 10, 5, 12, 15, 8 ]
    N = len(A);
 
    print(solve(A, N))
 
# This code is contributed by chitranayal

C#

// C# program to implement
// the above approach
using System;
class GFG{
  
// Function returns maximum
// possible value of k
static int solve(int[] A, int N)
{
      
    // Pointer i make sure that
    // A[i] will result in max k
    int i = 0;
  
    // Stores maximum possible k
    int k = 0;
  
    for(int j = 1; j < N; j++)
    {
          
        // Possible value of k for
        // current pair (A[i] and A[j])
        int tempK = Math.Min(A[i], A[j]) /
                              (j - i);
  
        // If current value exceeds k
        if (tempK > k)
        {
              
            // Update the value of k
            k = tempK;
        }
  
        // Update pointer i
        if (A[j] >= A[i] / (j - i))
            i = j;
    }
  
    // Return the maxm possible k
    return k;
}
  
// Driver Code
public static void Main(string[] args)
{
    int[] A = { 10, 5, 12, 15, 8 };
    int N = A.Length;
      
    Console.Write(solve(A, N));
}
}
  
// This code is contributed by rock_cool

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
// Function returns maximum
// possible value of k
function solve(A, N)
{
     
    // Pointer i make sure that
    // A[i] will result in max k
    let i = 0;
 
    // Stores maximum possible k
    let k = 0;
 
    for(let j = 1; j < N; j++)
    {
         
        // Possible value of k for
        // current pair (A[i] and A[j])
        let tempK = Math.min(A[i], A[j]) / (j - i);
 
        // If current value exceeds k
        if (tempK > k)
        {
             
            // Update the value of k
            k = tempK;
        }
 
        // Update pointer i
        if (A[j] >= A[i] / (j - i))
            i = j;
    }
 
    // Return the maxm possible k
    return k;
}
 
// Driver code
let A = [ 10, 5, 12, 15, 8 ];
let N = A.length;
 
document.write(solve(A, N));
 
// This code is contributed by divyeshrabadiya07
 
</script>
Producción: 

12

 

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

Publicación traducida automáticamente

Artículo escrito por chsadik99 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 *