Consultas para verificar si los elementos de la array de los índices [L, R] forman una progresión aritmética o no

Dada una array arr[] que consta de N enteros y una array Q[][2] que consta de M consultas de la forma {L, R} , la tarea de cada consulta es verificar si los elementos de la array están sobre el rango [L, R ] forma una progresión aritmética o no. Si es cierto , escriba “Sí” . De lo contrario, escriba “No”.

Ejemplos:

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


No
Explicación: 
Consulta 1: Los elementos de la array sobre el rango [0, 3] son ​​{1, 3, 5, 7} que forman una serie aritmética con una diferencia común de 2. Por lo tanto, imprime «Sí» .
Consulta 2: Los elementos de la array sobre el rango [3, 4 son {7, 6} que forman una serie aritmética con una diferencia común de -1. Por lo tanto, imprima «Sí».
Consulta 3: Los elementos de la array sobre el rango [2, 4 son {5, 7, 6}, que no forman una serie aritmética. Por lo tanto, imprima «Sí».

Entrada: arr[] = {1, 2}, Q[][] = {{0, 0}, {0, 1}, {0, 1}}
Salida:


Enfoque ingenuo: el enfoque más simple para resolver el problema es atravesar la array dada en el rango [L, R] para cada consulta y verificar si la diferencia común entre todos los elementos adyacentes es la misma o no. Si la diferencia es la misma, imprima «Sí» . De lo contrario, escriba “No”

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

Enfoque eficiente: el enfoque anterior se puede optimizar en función de las siguientes observaciones:

  • La idea es precalcular la longitud más larga del subarreglo que forma un AP a partir de cualquier índice i para cada i -ésimo elemento del arreglo en un arreglo auxiliar, digamos dp[] usando el algoritmo de dos punteros .
  • Para un rango dado [L, R] , si el valor de dp[L] es mayor o igual a (R – L) , entonces el rango siempre formará un AP ya que (R – L) es el rango actual de elementos y dp[L] almacena la longitud del subarreglo más largo que forma AP a partir del índice L , entonces la longitud del subarreglo debe ser menor que dp[L] .

Siga los pasos a continuación para resolver el problema:

  • Inicialice un arreglo, digamos dp[] para almacenar la longitud del subarreglo más largo a partir de cada índice para cada elemento en ese índice.
  • Iterar sobre el rango [0, N] usando la variable i y realizar los siguientes pasos:
    • Inicialice una variable, digamos j como (i + 1) para almacenar la última array de índice que forma la Progresión aritmética desde el índice i .
    • Incremente el valor de j hasta que (j + 1 < N) y (arr[j] – arr[j – 1]) sea igual a (arr[i + 1] – arr[i]).
    • Itere sobre el rango [i, j – 1] usando la variable, digamos K , y actualice el valor de dp[K] como (j – K) .
    • Actualice el valor de i como j .
  • Recorra la array dada de consultas Q[] y para cada consulta {L, R} si el valor de dp[L] es mayor o igual que (R – L) , luego imprima «Sí» . De lo contrario, escriba “No”.

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;
 
// Function to check if the given range
// of queries form an AP or not in the
// given array arr[]
void findAPSequence(int arr[], int N,
                    int Q[][2], int M)
{
    // Stores length of the longest
    // subarray forming AP for every
    // array element
    int dp[N + 5] = { 0 };
 
    // Iterate over the range [0, N]
    for (int i = 0; i + 1 < N;) {
 
        // Stores the index of the last
        // element of forming AP
        int j = i + 1;
 
        // Iterate until the element at
        // index (j, j + 1) forms AP
        while (j + 1 < N
               && arr[j + 1] - arr[j]
                      == arr[i + 1] - arr[i])
 
            // Increment j by 1
            j++;
 
        // Traverse the current subarray
        // over the range [i, j - 1]
        for (int k = i; k < j; k++) {
 
            // Update the length of the
            // longest subarray at index k
            dp[k] = j - k;
        }
 
        // Update the value of i
        i = j;
    }
 
    // Traverse the given queries
    for (int i = 0; i < M; i++) {
 
        // Print the result
        if (dp[Q[i][0]]
            >= Q[i][1] - Q[i][0]) {
            cout << "Yes" << endl;
        }
 
        // Otherwise
        else {
            cout << "No" << endl;
        }
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 3, 5, 7, 6, 5, 4, 1 };
    int Q[][2] = { { 0, 3 }, { 3, 4 }, { 2, 4 } };
    int N = sizeof(arr) / sizeof(arr[0]);
    int M = sizeof(Q) / sizeof(Q[0]);
 
    findAPSequence(arr, N, Q, M);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to check if the given range
// of queries form an AP or not in the
// given array arr[]
static void findAPSequence(int arr[], int N,
                           int Q[][], int M)
{
     
    // Stores length of the longest
    // subarray forming AP for every
    // array element
    int dp[] = new int[N + 5];
 
    // Iterate over the range [0, N]
    for(int i = 0; i + 1 < N;)
    {
         
        // Stores the index of the last
        // element of forming AP
        int j = i + 1;
 
        // Iterate until the element at
        // index (j, j + 1) forms AP
        while (j + 1 < N && arr[j + 1] - arr[j] ==
                            arr[i + 1] - arr[i])
 
            // Increment j by 1
            j++;
 
        // Traverse the current subarray
        // over the range [i, j - 1]
        for(int k = i; k < j; k++)
        {
             
            // Update the length of the
            // longest subarray at index k
            dp[k] = j - k;
        }
 
        // Update the value of i
        i = j;
    }
 
    // Traverse the given queries
    for(int i = 0; i < M; i++)
    {
         
        // Print the result
        if (dp[Q[i][0]] >= Q[i][1] - Q[i][0])
        {
            System.out.println("Yes");
        }
 
        // Otherwise
        else
        {
            System.out.println("No");
        }
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 1, 3, 5, 7, 6, 5, 4, 1 };
    int Q[][] = { { 0, 3 }, { 3, 4 }, { 2, 4 } };
    int N = arr.length;
    int M = Q.length;
 
    findAPSequence(arr, N, Q, M);
}
}
 
// This code is contributed by Kingash

Python3

# Python3 program for the above approach
 
# Function to check if the given range
# of queries form an AP or not in the
# given array arr[]
def findAPSequence(arr, N, Q, M):
 
    # Stores length of the longest
    # subarray forming AP for every
    # array element
    dp = [0] * (N + 5)
 
    # Iterate over the range [0, N]
    i = 0
     
    while i + 1 < N:
         
        # Stores the index of the last
        # element of forming AP
        j = i + 1
 
        # Iterate until the element at
        # index (j, j + 1) forms AP
        while (j + 1 < N and
           arr[j + 1] - arr[j] ==
           arr[i + 1] - arr[i]):
 
            # Increment j by 1
            j += 1
 
        # Traverse the current subarray
        # over the range [i, j - 1]
        for k in range(i, j):
 
            # Update the length of the
            # longest subarray at index k
            dp[k] = j - k
 
        # Update the value of i
        i = j
 
    # Traverse the given queries
    for i in range(M):
 
        # Print the result
        if (dp[Q[i][0]] >= Q[i][1] - Q[i][0]):
            print("Yes")
 
        # Otherwise
        else:
            print("No")
 
# Driver Code
if __name__ == "__main__":
 
    arr = [ 1, 3, 5, 7, 6, 5, 4, 1 ]
    Q = [ [ 0, 3 ], [ 3, 4 ], [ 2, 4 ] ]
    N = len(arr)
    M = len(Q)
 
    findAPSequence(arr, N, Q, M)
 
# This code is contributed by ukasp

C#

// C# code for above approach
using System;
 
public class GFG
{
   
    // Function to check if the given range
// of queries form an AP or not in the
// given array arr[]
static void findAPSequence(int[] arr, int N,
                           int[, ] Q, int M)
{
     
    // Stores length of the longest
    // subarray forming AP for every
    // array element
    int[] dp = new int[N + 5];
 
    // Iterate over the range [0, N]
    for(int i = 0; i + 1 < N;)
    {
         
        // Stores the index of the last
        // element of forming AP
        int j = i + 1;
 
        // Iterate until the element at
        // index (j, j + 1) forms AP
        while (j + 1 < N && arr[j + 1] - arr[j] ==
                            arr[i + 1] - arr[i])
 
            // Increment j by 1
            j++;
 
        // Traverse the current subarray
        // over the range [i, j - 1]
        for(int k = i; k < j; k++)
        {
             
            // Update the length of the
            // longest subarray at index k
            dp[k] = j - k;
        }
 
        // Update the value of i
        i = j;
    }
 
    // Traverse the given queries
    for(int i = 0; i < M; i++)
    {
         
        // Print the result
        if (dp[Q[i, 0]] >= Q[i, 1] - Q[i, 0])
        {
            Console.WriteLine("Yes");
        }
 
        // Otherwise
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
    static public void Main (){
      int[] arr = { 1, 3, 5, 7, 6, 5, 4, 1 };
    int[, ] Q = { { 0, 3 }, { 3, 4 }, { 2, 4 } };
    int N = arr.Length;
    int M = Q.GetLength(0);
 
    findAPSequence(arr, N, Q, M);
    }
}
 
// This code is contributed by offbeat

Javascript

<script>
// javascript program for the above approach
    // Function to check if the given range
    // of queries form an AP or not in the
    // given array arr
    function findAPSequence(arr , N , Q , M) {
 
        // Stores length of the longest
        // subarray forming AP for every
        // array element
        var dp = Array(N + 5).fill(0);
 
        // Iterate over the range [0, N]
        for (i = 0; i + 1 < N;) {
 
            // Stores the index of the last
            // element of forming AP
            var j = i + 1;
 
            // Iterate until the element at
            // index (j, j + 1) forms AP
            while (j + 1 < N && arr[j + 1] - arr[j] == arr[i + 1] - arr[i])
 
                // Increment j by 1
                j++;
 
            // Traverse the current subarray
            // over the range [i, j - 1]
            for (k = i; k < j; k++) {
 
                // Update the length of the
                // longest subarray at index k
                dp[k] = j - k;
            }
 
            // Update the value of i
            i = j;
        }
 
        // Traverse the given queries
        for (i = 0; i < M; i++) {
 
            // Print the result
            if (dp[Q[i][0]] >= Q[i][1] - Q[i][0]) {
                document.write("Yes <br/>");
            }
 
            // Otherwise
            else {
                document.write("No <br/>");
            }
        }
    }
 
    // Driver Code
     
        var arr = [ 1, 3, 5, 7, 6, 5, 4, 1 ];
        var Q = [ [ 0, 3 ], [ 3, 4 ], [ 2, 4 ] ];
        var N = arr.length;
        var M = Q.length;
 
        findAPSequence(arr, N, Q, M);
 
// This code contributed by umadevi9616
</script>
Producción: 

Yes
Yes
No

 

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

Publicación traducida automáticamente

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