Encuentre el índice en una array circular desde la cual la suma del prefijo siempre es no negativa

Dada una array circular arr[] que consta de N enteros, la tarea es encontrar el índice inicial de la array circular de modo que la suma del prefijo de ese índice siempre sea no negativa. Si no existe tal índice, imprima “-1” .

Ejemplos:

Entrada: arr[] = {3, -6, 7, -1, -4, 5, -1}
Salida: 2
Explicación:
Considere el índice 2 desde donde se calcula la suma del prefijo de la array circular dada, luego el la suma del prefijo está dada por {9, 3, 7, 6, 2, 7, 6}

Entrada: arr[] = {3, -5, -1}
Salida: -1

Enfoque: El problema dado se puede resolver con base en las siguientes observaciones:

Siga los pasos para resolver el problema:

  • Inicialice una variable, digamos suma como 0 , que almacene la suma de los elementos de la array .
  • Inicialice una variable, digamos como 0 que almacena el índice de inicio para el recorrido circular.
  • Inicialice una variable, digamos min como INT_MAX que almacena la suma mínima de prefijos de la array arr[] .
  • Recorra la array dada y realice los siguientes pasos:
    • Actualice el valor de sum como la suma de sum y el elemento actual arr[i] .
    • Si el valor de sum es menor que min , actualice min como sum y como ( i + 1) .
  • Si la suma de la array es negativa, imprima -1 . De lo contrario, imprima el valor de (en % N) como el posible índice resultante.

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 find the starting index
// of the given circular array s.t.
// prefix sum array is non negative
int startingPoint(int A[], int N)
{
    // Stores the sum of the array
    int sum = 0;
 
    // Stores the starting index
    int in = 0;
 
    // Stores the minimum prefix
    // sum of A[0..i]
    int min = INT_MAX;
 
    // Traverse the array arr[]
    for (int i = 0; i < N; i++) {
 
        // Update the value of sum
        sum += A[i];
 
        // If sum is less than min
        if (sum < min) {
 
            // Update the min as the
            // value of prefix sum
            min = sum;
 
            // Update in
            in = i + 1;
        }
    }
 
    // Otherwise, no such index is
    // possible
    if (sum < 0) {
        return -1;
    }
 
    return in % N;
}
 
// Driver Code
int main()
{
    int arr[] = { 3, -6, 7, -4, -4, 6, -1 };
    int N = (sizeof(arr) / sizeof(arr[0]));
    cout << startingPoint(arr, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to find the starting index
// of the given circular array s.t.
// prefix sum array is non negative
static int startingPoint(int A[], int N)
{
     
    // Stores the sum of the array
    int sum = 0;
 
    // Stores the starting index
    int in = 0;
 
    // Stores the minimum prefix
    // sum of A[0..i]
    int min = Integer.MAX_VALUE;
 
    // Traverse the array arr[]
    for(int i = 0; i < N; i++)
    {
         
        // Update the value of sum
        sum += A[i];
 
        // If sum is less than min
        if (sum < min)
        {
 
            // Update the min as the
            // value of prefix sum
            min = sum;
 
            // Update in
            in = i + 1;
        }
    }
 
    // Otherwise, no such index is
    // possible
    if (sum < 0)
    {
        return -1;
    }
 
    return in % N;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 3, -6, 7, -4, -4, 6, -1 };
    int N = arr.length;
     
    System.out.print(startingPoint(arr, N));
}
}
 
// This code is contributed by Kingash

Python3

# Python3 program for the above approach
 
# Function to find the starting index
# of the given circular array
# prefix sum array is non negative
import sys
 
def startingPoint(A, N):
     
    # Stores the sum of the array
    sum = 0
     
    # Stores the starting index
    startingindex = 0
     
    # Stores the minimum prefix
    # sum of A[0..i]
    min = sys.maxsize
     
    # Traverse the array
    for i in range(0, N):
         
        # Update the value of sum
        sum += A[i]
         
        # If sum is less than minimum
        if (sum < min):
             
            # Update the min as
            # the value of prefix sum
            min = sum
             
            # Update starting index
            startingindex = i + 1
             
    # Otherwise no such index is possible
    if (sum < 0):
        return -1
         
    return startingindex % N
 
# Driver code
arr = [ 3, -6, 7, -4, -4, 6, -1 ]
N = len(arr)
 
print(startingPoint(arr,N))
 
# This code is contributed by Virusbuddah

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to find the starting index
// of the given circular array s.t.
// prefix sum array is non negative
static int startingPoint(int[] A, int N)
{
     
    // Stores the sum of the array
    int sum = 0;
 
    // Stores the starting index
    int ind = 0;
 
    // Stores the minimum prefix
    // sum of A[0..i]
    int min = Int32.MaxValue;
 
    // Traverse the array arr[]
    for(int i = 0; i < N; i++)
    {
         
        // Update the value of sum
        sum += A[i];
 
        // If sum is less than min
        if (sum < min)
        {
             
            // Update the min as the
            // value of prefix sum
            min = sum;
 
            // Update in
            ind = i + 1;
        }
    }
 
    // Otherwise, no such index is
    // possible
    if (sum < 0)
    {
        return -1;
    }
 
    return ind % N;
}
 
// Driver Code
public static void Main()
{
    int[] arr = { 3, -6, 7, -4, -4, 6, -1 };
    int N = arr.Length;
     
    Console.Write(startingPoint(arr, N));
}
}
 
// This code is contributed by ukasp

Javascript

<script>
// javascript program for the above approach
    // Function to find the starting index
    // of the given circular array s.t.
    // prefix sum array is non negative
    function startingPoint(A , N) {
 
        // Stores the sum of the array
        var sum = 0;
 
        // Stores the starting index
        var it = 0;
 
        // Stores the minimum prefix
        // sum of A[0..i]
        var min = Number.MAX_VALUE;
 
        // Traverse the array arr
        for (i = 0; i < N; i++) {
 
            // Update the value of sum
            sum += A[i];
 
            // If sum is less than min
            if (sum < min) {
 
                // Update the min as the
                // value of prefix sum
                min = sum;
 
                // Update in
                it = i + 1;
            }
        }
 
        // Otherwise, no such index is
        // possible
        if (sum < 0) {
            return -1;
        }
 
        return it % N;
    }
 
    // Driver Code
     
        var arr = [ 3, -6, 7, -4, -4, 6, -1 ];
        var N = arr.length;
 
        document.write(startingPoint(arr, N));
 
// This code contributed by umadevi9616
</script>
Producción: 

5

 

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

Publicación traducida automáticamente

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