📌  相关文章
📜  在循环数组中查找索引,前缀总和始终为非负数

📅  最后修改于: 2021-05-14 01:06:01             🧑  作者: Mango

给定一个由N个整数组成的圆形数组arr [] ,任务是找到圆形数组的起始索引 这样该索引的前缀总和始终为非负数。如果不存在这样的索引,则打印“ -1”

例子:

方法:可以根据以下观察结果解决给定问题:

  • 如果数组元素的总和为负,则不存在从该点开始的前缀总和为非负的索引。
  • 否则,索引是具有最小前缀和的索引之后的索引。

请按照以下步骤解决问题:

  • 初始化一个变量,例如sum0 ,该变量存储数组元素的总和。
  • 初始化一个变量,以in表示0 ,该变量存储循环遍历的起始索引。
  • 初始化一个变量,比如说minINT_MAX ,该变量存储数组arr []的最小前缀和。
  • 遍历给定数组并执行以下步骤:
    • sum的值更新为sum与当前元素arr [i]的和
    • 如果sum的值小于min ,则将min作为sumin更新为(i +1)
  • 如果数组的总和为负,则打印-1 。否则,打印(%N)的值作为结果可能的索引。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
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


输出:
5

时间复杂度: O(N)
辅助空间: O(1)