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:
- Si la suma de los elementos de la array es negativa, entonces no existe tal índice cuyo prefijo suma desde ese punto no sea negativo.
- De lo contrario, el índice es el índice después del índice que tiene la suma mínima de prefijo .
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)