Verifique si una array se puede hacer estrictamente creciente incrementando y decrementando pares adyacentes

Dada una array arr[] de tamaño N que consta de enteros no negativos. En un movimiento , el elemento de índice i-ésimo de la array se reduce en 1 y el índice (i+1) se incrementa en 1. La tarea es verificar si existe alguna posibilidad de hacer que la array dada sea estrictamente creciente (que solo contenga números enteros no negativos). ) haciendo cualquier número de movimientos.

Ejemplos: 

Entrada: arr[3] = [1, 2, 3]
Salida:
Explicación: La array ya está ordenada en orden estrictamente creciente.

Entrada: arr[2] = [2, 0]
Salida:
Explicación : Considere i = 0 para el primer movimiento arr[0] = 2-1 = 1, arr[1] = 0 + 1 = 1. Ahora la array se convierte en [1, 1].
En el segundo movimiento considere i = 0. Así que ahora arr[0] = 1 – 1 = 0, arr[1] = 1 + 1 = 2. 
La array final se convierte en arr[2] = [0, 2], que es estrictamente creciente .

Entrada: arr[3] = [0, 1, 0]
Salida: No
Explicación : Esta array no se puede hacer estrictamente creciente que contenga solo números enteros no negativos mediante la realización de cualquier número de movimientos.

 

Enfoque: El problema se puede resolver usando la siguiente observación matemática. 

  • Dado que todos los elementos de la array no son negativos, el orden estrictamente creciente mínimo de una array de tamaño N puede ser: 0, 1, 2, 3. . . (N-1) .
  • Entonces, la suma mínima (min_sum) de los primeros i elementos (hasta el (it) índice) de cualquier array es min_sum = (i*(i-1))/2.
  • Por lo tanto, la suma de los primeros i elementos de la array dada (cur_sum) debe satisfacer la condición cur_sum ≥ min_sum .
  • Si la condición no se cumple , entonces no es posible hacer que la array dada sea estrictamente creciente. Considere el siguiente ejemplo

Ilustración 1:

arr[]           = 4 5 1 2 3
min_sum    = 0 1 3 6 10
sum(arr)   = 4 9 10 12 15

Como esta array satisface la condición para cada i, es posible convertir esta array en una array estrictamente creciente

Ilustración 2:

array[]           = 2 3 1 0 2
min_sum   = 0 1 3 6 10
suma(array)   = 2 5 6 6 8

Aquí, en el índice 4, la suma de la array no satisface la condición de tener una suma mínima de 10. Por lo tanto, no es posible cambiar la array a una estrictamente creciente.

Siga los pasos mencionados a continuación para implementar el concepto:

  • Atraviese de index = 0 a index = N – 1 , y para cada i verifique si la suma hasta eso es mayor o igual a (i*(i+1))/2 .
  • Si se cumple la condición, entonces la array se puede hacer estrictamente creciente. De lo contrario , no se puede hacer estrictamente creciente.

Siga la siguiente implementación para el enfoque anterior:

C++

// C++ code to check if the given array
// can be made strictly increasing
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if
// the array can be made strictly increasing
void CheckStrictlyIncreasing(int arr[],
                             int N)
{
    // variable to store sum till current
    // index element
    int cur_sum = 0;
    bool possible = true;
    for (int index = 0;
         index < N; index++) {
        cur_sum += arr[index];
 
        // Sum of 0, 1, ...(i)th element
        int req_sum = (index * (index + 1)) / 2;
 
        // Check if valid or not
        if (req_sum > cur_sum) {
            possible = false;
            break;
        }
    }
 
    // If can be made strictly increasing
    if (possible)
        cout << "Yes";
    else
        cout << "No";
}
 
// Driver code
int main()
{
    int arr[3] = { 1, 2, 3 };
    int N = 3;
 
    CheckStrictlyIncreasing(arr, N);
    return 0;
}

Java

// Java code to check if the given array
// can be made strictly increasing
import java.util.*;
 
class GFG{
 
// Function to check if
// the array can be made strictly increasing
static void CheckStrictlyIncreasing(int arr[],
                             int N)
{
    // variable to store sum till current
    // index element
    int cur_sum = 0;
    boolean possible = true;
    for (int index = 0;
         index < N; index++) {
        cur_sum += arr[index];
 
        // Sum of 0, 1, ...(i)th element
        int req_sum = (index * (index + 1)) / 2;
 
        // Check if valid or not
        if (req_sum > cur_sum) {
            possible = false;
            break;
        }
    }
 
    // If can be made strictly increasing
    if (possible)
        System.out.print("Yes");
    else
        System.out.print("No");
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 1, 2, 3 };
    int N = 3;
 
    CheckStrictlyIncreasing(arr, N);
}
}
 
// This code is contributed by shikhasingrajput

Python3

# Python 3 code to check if the given array
# can be made strictly increasing
 
# Function to check if
# the array can be made strictly increasing
def CheckStrictlyIncreasing(arr,
                            N):
 
    # variable to store sum till current
    # index element
    cur_sum = 0
    possible = True
    for index in range(N):
        cur_sum += arr[index]
 
        # Sum of 0, 1, ...(i)th element
        req_sum = (index * (index + 1)) // 2
 
        # Check if valid or not
        if (req_sum > cur_sum):
            possible = False
            break
 
    # If can be made strictly increasing
    if (possible):
        print("Yes")
 
    else:
        print("No")
 
# Driver code
if __name__ == "__main__":
 
    arr = [1, 2, 3]
    N = 3
 
    CheckStrictlyIncreasing(arr, N)
 
    # This code is contributed by ukasp.

C#

// C# code to check if the given array
// can be made strictly increasing
using System;
 
class GFG{
 
// Function to check if the array can
// be made strictly increasing
static void CheckStrictlyIncreasing(int []arr,
                                    int N)
{
     
    // Variable to store sum till current
    // index element
    int cur_sum = 0;
    bool possible = true;
    for(int index = 0;
            index < N; index++)
    {
        cur_sum += arr[index];
 
        // Sum of 0, 1, ...(i)th element
        int req_sum = (index * (index + 1)) / 2;
 
        // Check if valid or not
        if (req_sum > cur_sum)
        {
            possible = false;
            break;
        }
    }
 
    // If can be made strictly increasing
    if (possible)
        Console.Write("Yes");
    else
        Console.Write("No");
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 1, 2, 3 };
    int N = 3;
 
    CheckStrictlyIncreasing(arr, N);
}
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
       // JavaScript code for the above approach
 
       // Function to check if
       // the array can be made strictly increasing
       function CheckStrictlyIncreasing(arr, N)
       {
            
           // variable to store sum till current
           // index element
           let cur_sum = 0;
           let possible = true;
           for (let index = 0;
               index < N; index++) {
               cur_sum += arr[index];
 
               // Sum of 0, 1, ...(i)th element
               let req_sum = (index * (index + 1)) / 2;
 
               // Check if valid or not
               if (req_sum > cur_sum) {
                   possible = false;
                   break;
               }
           }
 
           // If can be made strictly increasing
           if (possible)
               document.write("Yes");
           else
               document.write("No");
       }
 
       // Driver code
       let arr = [1, 2, 3];
       let N = 3;
 
       CheckStrictlyIncreasing(arr, N);
 
 // This code is contributed by Potta Lokesh
   </script>
Producción

Yes

Complejidad de tiempo: O(N)
Complejidad de espacio: O(1)

Publicación traducida automáticamente

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