📌  相关文章
📜  打印数组元素的索引,其删除将使奇数和偶数索引元素的总和相等

📅  最后修改于: 2021-05-17 17:36:41             🧑  作者: Mango

给定大小为N的数组arr [] ,任务是查找数组元素的索引,将其删除使奇数和偶数索引元素之和相等。如果不存在这样的元素,则打印-1

例子:

天真的方法:解决此问题的最简单方法是遍历数组并从数组中删除第i元素,并检查奇数索引数组元素的总和是否等于偶数索引数组元素的总和。如果发现为真,则打印索引。

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

高效的方法:可以使用Prefix Sum技术优化上述方法。这种想法是利用以下事实:如果将数组元素从索引中删除,则在该索引之后,偶数索引的数组元素将成为奇数索引,反之亦然。请按照以下步骤解决问题:

  • 初始化两个数组,例如奇数[]偶数[] ,分别存储奇数和偶数索引的数组元素的前缀和以及偶数索引的数组元素的前缀和。
  • 遍历数组arr []并计算奇数和偶数索引数组元素的前缀和。
  • 初始化两个变量,例如P = 0Q = 0 ,以分别在删除数组元素后存储偶数索引数组和奇数索引数组元素的总和。
  • 遍历数组并一一删除数组元素,并相应地更新前缀和。检查偶数索引数组元素P的总和是否等于奇数索引数组元素Q的总和。如果发现为真,则打印当前索引。
  • 否则,打印-1

下面是上述方法的实现:

C++
// C++ program to implement
// the above approach
 
#include 
using namespace std;
 
// Function to find indices of array elements
// whose removal makes the sum of odd and
// even indexed array elements equal
void removeIndicesToMakeSumEqual(vector& arr)
{
    // Stores size of array
    int N = arr.size();
 
    // Store prefix sum of odd
    // index array elements
    vector odd(N, 0);
 
    // Store prefix sum of even
    // index array elements
    vector even(N, 0);
 
    // Update even[0]
    even[0] = arr[0];
 
    // Traverse the given array
    for (int i = 1; i < N; i++) {
 
        // Update odd[i]
        odd[i] = odd[i - 1];
 
        // Update even[i]
        even[i] = even[i - 1];
 
        // If the current index
        // is an even number
        if (i % 2 == 0) {
 
            // Update even[i]
            even[i] += arr[i];
        }
 
        // If the current index
        // is an odd number
        else {
 
            // Update odd[i]
            odd[i] += arr[i];
        }
    }
 
    // Check if at least one
    // index found or not that
    // satisfies the condition
    bool find = 0;
 
    // Store odd indices sum by
    // removing 0-th index
    int p = odd[N - 1];
 
    // Store even indices sum by
    // removing 0-th index
    int q = even[N - 1] - arr[0];
 
    // If p and q are equal
    if (p == q) {
        cout << "0 ";
        find = 1;
    }
 
    // Traverse the array arr[]
    for (int i = 1; i < N; i++) {
 
        // If i is an even number
        if (i % 2 == 0) {
 
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1]
                - arr[i] + odd[i - 1];
 
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1]
                + even[i - 1];
        }
        else {
 
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1]
                - arr[i] + even[i - 1];
 
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1]
                + odd[i - 1];
        }
 
        // If odd index values sum is equal
        // to even index values sum
        if (p == q) {
 
            // Set the find variable
            find = 1;
 
            // Print the current index
            cout << i << " ";
        }
    }
 
    // If no index found
    if (!find) {
 
        // Print not possible
        cout << -1;
    }
}
 
// Driver Code
int main()
{
    vector arr = { 4, 1, 6, 2 };
    removeIndicesToMakeSumEqual(arr);
 
    return 0;
}


Java
// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Function to find indices of array elements
// whose removal makes the sum of odd and
// even indexed array elements equal
static void removeIndicesToMakeSumEqual(int []arr)
{
     
    // Stores size of array
    int N = arr.length;
 
    // Store prefix sum of odd
    // index array elements
    int []odd = new int[N];
 
    // Store prefix sum of even
    // index array elements
    int []even = new int[N];
 
    // Update even[0]
    even[0] = arr[0];
 
    // Traverse the given array
    for(int i = 1; i < N; i++)
    {
         
        // Update odd[i]
        odd[i] = odd[i - 1];
 
        // Update even[i]
        even[i] = even[i - 1];
 
        // If the current index
        // is an even number
        if (i % 2 == 0)
        {
             
            // Update even[i]
            even[i] += arr[i];
        }
 
        // If the current index
        // is an odd number
        else
        {
             
            // Update odd[i]
            odd[i] += arr[i];
        }
    }
 
    // Check if at least one
    // index found or not that
    // satisfies the condition
    boolean find = false;
 
    // Store odd indices sum by
    // removing 0-th index
    int p = odd[N - 1];
 
    // Store even indices sum by
    // removing 0-th index
    int q = even[N - 1] - arr[0];
 
    // If p and q are equal
    if (p == q)
    {
        System.out.print("0 ");
        find = true;
    }
 
    // Traverse the array arr[]
    for(int i = 1; i < N; i++)
    {
         
        // If i is an even number
        if (i % 2 == 0)
        {
             
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1] -
                     arr[i] + odd[i - 1];
 
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1] +
               even[i - 1];
        }
        else
        {
             
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1] -
                    arr[i] + even[i - 1];
 
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1] +
                 odd[i - 1];
        }
 
        // If odd index values sum is equal
        // to even index values sum
        if (p == q)
        {
 
            // Set the find variable
            find = true;
 
            // Print the current index
            System.out.print(i + " ");
        }
    }
 
    // If no index found
    if (!find)
    {
         
        // Print not possible
        System.out.print(-1);
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int[] arr = { 4, 1, 6, 2 };
     
    removeIndicesToMakeSumEqual(arr);
}
}
 
// This code is contributed by Amit Katiyar


Python3
# Python program to implement
# the above approach
 
# Function to find indices of array elements
# whose removal makes the sum of odd and
# even indexed array elements equal
def removeIndicesToMakeSumEqual(arr):
   
    # Stores size of array
    N = len(arr);
 
    # Store prefix sum of odd
    # index array elements
    odd = [0] * N;
 
    # Store prefix sum of even
    # index array elements
    even = [0] * N;
 
    # Update even[0]
    even[0] = arr[0];
 
    # Traverse the given array
    for i in range(1, N):
 
        # Update odd[i]
        odd[i] = odd[i - 1];
 
        # Update even[i]
        even[i] = even[i - 1];
 
        # If the current index
        # is an even number
        if (i % 2 == 0):
 
            # Update even[i]
            even[i] += arr[i];
 
        # If the current index
        # is an odd number
        else:
 
            # Update odd[i]
            odd[i] += arr[i];
 
    # Check if at least one
    # index found or not that
    # satisfies the condition
    find = False;
 
    # Store odd indices sum by
    # removing 0-th index
    p = odd[N - 1];
 
    # Store even indices sum by
    # removing 0-th index
    q = even[N - 1] - arr[0];
 
    # If p and q are equal
    if (p == q):
        print("0 ");
        find = True;
 
    # Traverse the array arr
    for i in range(1, N):
 
        # If i is an even number
        if (i % 2 == 0):
 
            # Update p by removing
            # the i-th element
            p = even[N - 1] - even[i - 1] - arr[i] + odd[i - 1];
 
            # Update q by removing
            # the i-th element
            q = odd[N - 1] - odd[i - 1] + even[i - 1];
        else:
 
            # Update q by removing
            # the i-th element
            q = odd[N - 1] - odd[i - 1] - arr[i] + even[i - 1];
 
            # Update p by removing
            # the i-th element
            p = even[N - 1] - even[i - 1] + odd[i - 1];
 
        # If odd index values sum is equal
        # to even index values sum
        if (p == q):
           
            # Set the find variable
            find = True;
 
            # Prthe current index
            print(i, end = "");
 
    # If no index found
    if (find == False):
       
        # Prnot possible
        print(-1);
 
# Driver Code
if __name__ == '__main__':
    arr = [4, 1, 6, 2];
 
    removeIndicesToMakeSumEqual(arr);
 
    # This code is contributed by shikhasingrajput


C#
// C# program to implement
// the above approach
using System;
 
class GFG{
     
// Function to find indices of array elements
// whose removal makes the sum of odd and
// even indexed array elements equal
static void removeIndicesToMakeSumEqual(int []arr)
{
     
    // Stores size of array
    int N = arr.Length;
 
    // Store prefix sum of odd
    // index array elements
    int []odd = new int[N];
 
    // Store prefix sum of even
    // index array elements
    int []even = new int[N];
 
    // Update even[0]
    even[0] = arr[0];
 
    // Traverse the given array
    for(int i = 1; i < N; i++)
    {
         
        // Update odd[i]
        odd[i] = odd[i - 1];
 
        // Update even[i]
        even[i] = even[i - 1];
 
        // If the current index
        // is an even number
        if (i % 2 == 0)
        {
             
            // Update even[i]
            even[i] += arr[i];
        }
 
        // If the current index
        // is an odd number
        else
        {
             
            // Update odd[i]
            odd[i] += arr[i];
        }
    }
 
    // Check if at least one
    // index found or not that
    // satisfies the condition
    bool find = false;
 
    // Store odd indices sum by
    // removing 0-th index
    int p = odd[N - 1];
 
    // Store even indices sum by
    // removing 0-th index
    int q = even[N - 1] - arr[0];
 
    // If p and q are equal
    if (p == q)
    {
        Console.Write("0 ");
        find = true;
    }
 
    // Traverse the array arr[]
    for(int i = 1; i < N; i++)
    {
         
        // If i is an even number
        if (i % 2 == 0)
        {
             
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1] -
                     arr[i] + odd[i - 1];
 
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1] +
               even[i - 1];
        }
        else
        {
             
            // Update q by removing
            // the i-th element
            q = odd[N - 1] - odd[i - 1] -
                    arr[i] + even[i - 1];
 
            // Update p by removing
            // the i-th element
            p = even[N - 1] - even[i - 1] +
                 odd[i - 1];
        }
 
        // If odd index values sum is equal
        // to even index values sum
        if (p == q)
        {
 
            // Set the find variable
            find = true;
 
            // Print the current index
            Console.Write(i + " ");
        }
    }
 
    // If no index found
    if (!find)
    {
         
        // Print not possible
        Console.Write(-1);
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    int[] arr = { 4, 1, 6, 2 };
     
    removeIndicesToMakeSumEqual(arr);
}
}
 
// This code is contributed by AnkThon


输出:
1

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