Given a circular array arr[] consisting of N integers, the task is to find the starting index of the circular array such that the prefix sum from that index is always non-negative. If there exists no such index, then print “-1”.
Examples:
Input: arr[] = {3, -6, 7, -1, -4, 5, -1}
Output: 2
Explanation:
Consider the index 2 from where the prefix sum of the given circular array is being calculated, then the prefix sum is given by {9, 3, 7, 6, 2, 7, 6}Input: arr[] = {3, -5, -1}
Output: -1
Approach: The given problem can be solved based on the following observations:
- If the sum of the array elements is negative, then there exists no such index whose prefix sum from that point is non-negative.
- Otherwise, the index is the index after the index having the Minimum Prefix Sum.
Follow the steps to solve the problem:
- Initialize a variable, say sum as 0, that stores the sum of array elements.
- Initialize a variable, say in as 0 that stores the starting index for the circular traversal.
- Initialize a variable, say min as INT_MAX that stores the minimum prefix sum of the array arr[].
-
Traverse the given array and perform the following steps:
- Update the value of sum as the sum of sum and the current element arr[i].
- If the value of sum is less than min, then update the min as sum and in as (i + 1).
- If the sum of the array is negative, then print -1. Otherwise, print the value of (in % N) as the resultant possible index.
Below is the implementation of the above approach:
// 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 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 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# 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 |
<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> |
5
Time Complexity: O(N)
Auxiliary Space: O(1)