📌  相关文章
📜  通过在偶数大小的子数组上右移获得的偶数索引元素的最大总和

📅  最后修改于: 2021-09-04 08:36:07             🧑  作者: Mango

给定一个数组arr[] ,我们需要找到对任何偶数长度为 1 的子数组进行右移操作可以获得的偶数索引元素的最大和。
例子:

朴素的方法:朴素的方法是将每个可能的偶数长度子数组右移一个,并在每个可能的子数组移位后找到所有数组的偶数索引元素的总和。所有数组中的最大和就是所需的结果。
时间复杂度: O(N 2 )
辅助空间: O(1)
有效的方法:为了优化上述简单的方法,我们可以观察到在对任何偶数子数组执行右移 1 后,奇数索引值被偶数索引值替换,反之亦然。如果我们在移位之前找到偶数索引处的元素总和(比如sum ),那么在移位之后,总和被改变为偶数和奇数索引处的元素之间的连续差之和。
例如:

我们将使用上述概念来解决这个问题。以下是步骤:

  1. 创建两个数组(比如arr1[]arr2[] ),这样arr1[]将存储数组arr[] 中元素的连续差为:
{(a[1] – a[0]), (a[3] – a[2]), . . ., (a[n]-a[n-1])}
  1. arr2[]将数组arr[] 中元素的连续差值存储为:
{(a[1] – a[2]), (a[3] – a[4]), . . ., (a[n-1]-a[n])}
  1. 然后在上面形成的两个数组中使用Kadane算法找到最大子数组和。
  2. 现在最大和是原始数组( arr[] )中偶数索引处元素的总和 + 两个数组arr1[]arr2[] 的最大子数组总和。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Kadane's Algorithm to find
// the maximum sum sub array
int kadane(vector v)
{
    int maxSoFar = 0;
    int maxEndingHere = 0;
 
    // Iterate array v
    for (int i = 0; i < v.size(); i++) {
 
        maxEndingHere += v[i];
 
        // Update the maximum
        maxSoFar = max(maxEndingHere,
                    maxSoFar);
 
        // Update maxEndingHere to 0 if it
        // is less than 0
        maxEndingHere
            = max(maxEndingHere, 0);
    }
 
    // Return maximum sum
    return maxSoFar;
}
 
// Function to find the sum
// of even indexed elements
// after modification in array.
int sumOfElements(int* arr, int n)
{
    int sum = 0;
 
    // Find initial sum of
    // even indexed elements
    for (int i = 0; i < n; i++) {
        if (i % 2 == 0)
            sum += arr[i];
    }
 
    // Create two vectors to store
    // the consecutive differences
    // of elements
    vector v1;
    vector v2;
 
    for (int i = 1; i < n; i += 2) {
 
        v1.push_back(arr[i]
                    - arr[i - 1]);
 
        if (i + 1 < n) {
            v2.push_back(arr[i]
                        - arr[i + 1]);
        }
    }
 
    // Find the maximum sum subarray
    int option1 = kadane(v1);
    int option2 = kadane(v2);
 
    // Add the maximum value
    // to initial sum
    int ans = sum + max(option1,
                        option2);
 
    // Return the answer
    return ans;
}
 
// Driver Code
int main()
{
    // Given array arr[]
    int arr[] = { 5, 1, 3, 4, 5, 6 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << sumOfElements(arr, N);
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Kadane's Algorithm to find
// the maximum sum sub array
static int kadane(Vector v)
{
    int maxSoFar = 0;
    int maxEndingHere = 0;
 
    // Iterate array v
    for(int i = 0; i < v.size(); i++)
    {
    maxEndingHere += v.get(i);
         
    // Update the maximum
    maxSoFar = Math.max(maxEndingHere,
                        maxSoFar);
         
    // Update maxEndingHere to 0 if it
    // is less than 0
    maxEndingHere = Math.max(maxEndingHere, 0);
    }
     
    // Return maximum sum
    return maxSoFar;
}
 
// Function to find the sum
// of even indexed elements
// after modification in array.
static int sumOfElements(int []arr, int n)
{
    int sum = 0;
 
    // Find initial sum of
    // even indexed elements
    for(int i = 0; i < n; i++)
    {
    if (i % 2 == 0)
        sum += arr[i];
    }
 
    // Create two vectors to store
    // the consecutive differences
    // of elements
    Vector v1 = new Vector();
    Vector v2 = new Vector();
 
    for(int i = 1; i < n; i += 2)
    {
    v1.add(arr[i] - arr[i - 1]);
         
    if (i + 1 < n)
    {
        v2.add(arr[i] - arr[i + 1]);
    }
    }
     
    // Find the maximum sum subarray
    int option1 = kadane(v1);
    int option2 = kadane(v2);
 
    // Add the maximum value
    // to initial sum
    int ans = sum + Math.max(option1,
                            option2);
 
    // Return the answer
    return ans;
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given array arr[]
    int arr[] = { 5, 1, 3, 4, 5, 6 };
 
    int N = arr.length;
 
    // Function Call
    System.out.print(sumOfElements(arr, N));
}
}
 
// This code is contributed by Amit Katiyar


Python3
# Python3 program for the above approach
 
# Kadane's Algorithm to find
# the maximum sum sub array
def kadane(v):
 
    maxSoFar = 0;
    maxEndingHere = 0;
 
    # Iterate array v
    for i in range(len(v)):
        maxEndingHere += v[i];
 
        # Update the maximum
        maxSoFar = max(maxEndingHere,
                    maxSoFar);
 
        # Update maxEndingHere to 0
        # if it is less than 0
        maxEndingHere = max(maxEndingHere, 0);
 
    # Return maximum sum
    return maxSoFar;
 
# Function to find the sum
# of even indexed elements
# after modification in array.
def sumOfElements(arr, n):
 
    sum = 0;
 
    # Find initial sum of
    # even indexed elements
    for i in range(n):
        if (i % 2 == 0):
            sum += arr[i];
 
    # Create two vectors to store
    # the consecutive differences
    # of elements
    v1 = [];
    v2 = [];
 
    for i in range(1, n, 2):
        v1.append(arr[i] - arr[i - 1]);
 
        if (i + 1 < n):
            v2.append(arr[i] - arr[i + 1]);
 
    # Find the maximum sum subarray
    option1 = kadane(v1);
    option2 = kadane(v2);
 
    # Add the maximum value
    # to initial sum
    ans = sum + max(option1, option2);
 
    # Return the answer
    return ans;
 
# Driver Code
if __name__ == "__main__" :
 
    # Given array arr[]
    arr = [ 5, 1, 3, 4, 5, 6 ];
 
    N = len(arr);
 
    # Function call
    print(sumOfElements(arr, N));
 
# This code is contributed by AnkitRai01


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Kadane's Algorithm to find
// the maximum sum sub array
static int kadane(List v)
{
    int maxSoFar = 0;
    int maxEndingHere = 0;
 
    // Iterate array v
    for(int i = 0; i < v.Count; i++)
    {
        maxEndingHere += v[i];
             
        // Update the maximum
        maxSoFar = Math.Max(maxEndingHere,
                            maxSoFar);
             
        // Update maxEndingHere to 0 if it
        // is less than 0
        maxEndingHere = Math.Max(maxEndingHere, 0);
    }
     
    // Return maximum sum
    return maxSoFar;
}
 
// Function to find the sum
// of even indexed elements
// after modification in array.
static int sumOfElements(int []arr, int n)
{
    int sum = 0;
 
    // Find initial sum of
    // even indexed elements
    for(int i = 0; i < n; i++)
    {
        if (i % 2 == 0)
            sum += arr[i];
    }
 
    // Create two vectors to store
    // the consecutive differences
    // of elements
    List v1 = new List();
    List v2 = new List();
 
    for(int i = 1; i < n; i += 2)
    {
        v1.Add(arr[i] - arr[i - 1]);
         
        if (i + 1 < n)
        {
            v2.Add(arr[i] - arr[i + 1]);
        }
    }
     
    // Find the maximum sum subarray
    int option1 = kadane(v1);
    int option2 = kadane(v2);
 
    // Add the maximum value
    // to initial sum
    int ans = sum + Math.Max(option1,
                             option2);
 
    // Return the answer
    return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given array []arr
    int []arr = { 5, 1, 3, 4, 5, 6 };
 
    int N = arr.Length;
 
    // Function call
    Console.Write(sumOfElements(arr, N));
}
}
 
// This code is contributed by Amit Katiyar


Javascript


输出:
15

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

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live