Maximizar la diferencia entre la suma de elementos indexados pares e impares de una subsecuencia – Part 1

Dada una array arr[] que consta de N enteros positivos, la tarea es encontrar la máxima diferencia posible entre la suma de elementos indexados pares e impares de una subsecuencia de la array dada.

Ejemplos:

Entrada: arr[] = { 3, 2, 1, 4, 5, 2, 1, 7, 8, 9 } 
Salida: 15 
Explicación: 
Considerando las subsecuencias { 3, 1, 5, 1, 9 } del arreglo 
Sum de elementos de array indexados pares = 3 + 5 + 9 = 17 
La suma de elementos de array indexados impares = es 1 + 1 = 2 
Por lo tanto, la diferencia entre la suma de elementos indexados pares e impares presentes en la subsecuencia = (17 – 2) = 15, que es el máximo posible.

Entrada: arr[] = {1, 2, 3, 4, 5, 6}
Salida: 6

Enfoque ingenuo: el enfoque más simple para resolver este problema es generar todas las subsecuencias posibles de la array dada y, para cada subsecuencia, calcular la diferencia entre la suma de los elementos indexados pares e impares de la subsecuencia. Finalmente, imprima la diferencia máxima obtenida. 

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

Enfoque eficiente: para optimizar el enfoque anterior, la idea es almacenar los máximos locales en índices pares de la subsecuencia y almacenar los mínimos locales en índices impares de la subsecuencia. Finalmente, imprima la diferencia entre la suma de los índices pares e impares de la subsecuencia. 
Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos maxDiff , para almacenar la diferencia máxima entre la suma de elementos indexados pares e impares de una subsecuencia.
  • Recorra la array arr[] y compruebe si arr[i] > arr[i + 1] y arr[i] < arr[i – 1] o no. Si se determina que es cierto, actualice maxDiff += arr[i] .
  • De lo contrario, compruebe si arr[i] > arr[i + 1] y arr[i] < arr[i – 1] o no. Si se determina que es cierto, actualice maxDiff -= arr[i] .
  • Finalmente, imprima el valor de maxDiff .

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 to find the maximum possible difference
// between sum of even and odd indices
int maxPossibleDiff(vector<int>& arr, int N)
{
 
    // Convert arr[] into 1-based indexing
    arr.push_back(-1);
 
    // Reverse the array
    reverse(arr.begin(), arr.end());
 
    // Convert arr[] into 1 based index
    arr.push_back(-1);
 
    // Reverse the array
    reverse(arr.begin(), arr.end());
 
    // Stores maximum difference between
    // sum of even and odd indexed elements
    int maxDiff = 0;
 
    // Traverse the array
    for (int i = 1; i <= N; i++) {
 
        // If arr[i] is local maxima
        if (arr[i] > arr[i - 1]
            && arr[i] > arr[i + 1]) {
 
            // Update maxDiff
            maxDiff += arr[i];
        }
 
        // If arr[i] is local minima
        if (arr[i] < arr[i - 1]
            && arr[i] < arr[i + 1]) {
 
            // Update maxDiff
            maxDiff -= arr[i];
        }
    }
    cout << maxDiff;
}
 
// Driver Code
int main()
{
 
    vector<int> arr = { 3, 2, 1, 4, 5,
                        2, 1, 7, 8, 9 };
 
    // Size of array
    int N = arr.size();
 
    // Function Call
    maxPossibleDiff(arr, N);
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Function to find the maximum possible
// difference between sum of even and
// odd indices
static void maxPossibleDiff(Vector<Integer> arr, int N)
{
     
    // Convert arr[] into 1-based indexing
    arr.add(-1);
 
    // Reverse the array
    Collections.reverse(arr);
 
    // Convert arr[] into 1 based index
    arr.add(-1);
 
    // Reverse the array
    Collections.reverse(arr);
 
    // Stores maximum difference between
    // sum of even and odd indexed elements
    int maxDiff = 0;
 
    // Traverse the array
    for(int i = 1; i <= N; i++)
    {
         
        // If arr.get(i) is local maxima
        if (arr.get(i) > arr.get(i - 1) &&
            arr.get(i) > arr.get(i + 1))
        {
             
            // Update maxDiff
            maxDiff += arr.get(i);
        }
 
        // If arr.get(i) is local minima
        if (arr.get(i) < arr.get(i - 1) &&
            arr.get(i) < arr.get(i + 1))
        {
             
            // Update maxDiff
            maxDiff -= arr.get(i);
        }
    }
    System.out.print(maxDiff);
}
 
// Driver Code
public static void main(String[] args)
{
    int[] array = { 3, 2, 1, 4, 5,
                    2, 1, 7, 8, 9 };
    Vector<Integer> v = new Vector<>();
    for(int i :array)
    {
        v.add(i);
    }
     
    // Size of array
    int N = v.size();
 
    // Function Call
    maxPossibleDiff(v, N);
}
}
 
// This code is contributed by shikhasingrajput

Python3

#Python3 program to implement
#the above approach
 
 
#Function to find the maximum possible difference
#between sum of even and odd indices
def maxPossibleDiff(arr,  N):
 
    #Convert arr[] o 1-based indexing
    arr.append(-1)
 
    #Reverse the array
    arr = arr[::-1]
 
    #Convert arr[] o 1 based index
    arr.append(-1)
 
    #Reverse the array
    arr = arr[::-1]
 
    #Stores maximum difference between
    #sum of even and odd indexed elements
    maxDiff = 0
 
    #Traverse the array
    for i in range(1,N+1):
 
        #If arr[i] is local maxima
        if (arr[i] > arr[i - 1] and arr[i] > arr[i + 1]):
 
            #Update maxDiff
            maxDiff += arr[i]
 
        #If arr[i] is local minima
        if (arr[i] < arr[i - 1] and arr[i] < arr[i + 1]):
 
            #Update maxDiff
            maxDiff -= arr[i]
    print (maxDiff)
 
#Driver Code
if __name__ == '__main__':
 
    arr = [3, 2, 1, 4, 5, 2, 1, 7, 8, 9]
 
    #Size of array
    N = len(arr)
 
    #Function Call
    maxPossibleDiff(arr, N)

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
 
public class GFG{
 
// Function to find the maximum possible
// difference between sum of even and
// odd indices
static void maxPossibleDiff(List<int> arr, int N)
{
     
    // Convert []arr into 1-based indexing
    arr.Add(-1);
 
    // Reverse the array
    arr.Reverse();
 
    // Convert []arr into 1 based index
    arr.Add(-1);
 
    // Reverse the array
    arr.Reverse();
 
    // Stores maximum difference between
    // sum of even and odd indexed elements
    int maxDiff = 0;
 
    // Traverse the array
    for(int i = 1; i <= N; i++)
    {
         
        // If arr[i] is local maxima
        if (arr[i] > arr[i - 1] &&
            arr[i] > arr[i + 1])
        {
             
            // Update maxDiff
            maxDiff += arr[i];
        }
 
        // If arr[i] is local minima
        if (arr[i] < arr[i - 1] &&
            arr[i] < arr[i + 1])
        {
             
            // Update maxDiff
            maxDiff -= arr[i];
        }
    }
    Console.Write(maxDiff);
}
 
// Driver Code
public static void Main(String[] args)
{
    int[] array = { 3, 2, 1, 4, 5,
                    2, 1, 7, 8, 9 };
    List<int> v = new List<int>();
    foreach(int i in array)
    {
        v.Add(i);
    }
     
    // Size of array
    int N = v.Count;
 
    // Function Call
    maxPossibleDiff(v, N);
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
  
// JavaScript program to implement
// the above approach
 
// Function to find the maximum possible difference
// between sum of even and odd indices
function maxPossibleDiff(arr, N)
{
 
    // Convert arr[] into 1-based indexing
    arr.push(-1);
 
    // Reverse the array
    arr.reverse();
 
    // Convert arr[] into 1 based index
    arr.push(-1);
 
    // Reverse the array
    arr.reverse();
 
    // Stores maximum difference between
    // sum of even and odd indexed elements
    var maxDiff = 0;
 
    // Traverse the array
    for (var i = 1; i <= N; i++) {
 
        // If arr[i] is local maxima
        if (arr[i] > arr[i - 1]
            && arr[i] > arr[i + 1]) {
 
            // Update maxDiff
            maxDiff += arr[i];
        }
 
        // If arr[i] is local minima
        if (arr[i] < arr[i - 1]
            && arr[i] < arr[i + 1]) {
 
            // Update maxDiff
            maxDiff -= arr[i];
        }
    }
    document.write( maxDiff);
}
 
// Driver Code
 
var arr = [3, 2, 1, 4, 5,
                    2, 1, 7, 8, 9];
                     
// Size of array
var N = arr.length;
 
// Function Call
maxPossibleDiff(arr, N);
 
</script>   
Producción: 

15

 

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

Publicación traducida automáticamente

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