给定数组arr [] ,我们需要找到偶数索引元素的最大和,可以通过对偶数长度乘以1的任何子数组执行右移运算来获得最大和。
例子:
Input: arr[] = {5, 1, 3, 4, 5, 6}
Output: 15
Explanation:
We can perform a right shift on index 2 to 5 then resulting array is:
arr[] = {5, 1, 6, 3, 4, 5}
Sum of elements at even indexes = 5 + 6 + 4 = 15
Input: arr[] = {7, 9, 1, 8, 3, 10, 4, 12}
Output: 39
Explanation:
We can perform a right shift on index 0 to 7 then resulting array is:
arr[] = {12, 7, 9, 1, 8, 3, 10, 4}
Sum of elements at even indexes = 12 + 9 + 8 + 10 = 39
朴素的方法:朴素的方法是将每个可能的偶数长度的子数组右移一个,并在每次可能的子数组移动后找到所有数组的偶数索引处的元素之和。所有数组中的最大和是所需的结果。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:为了优化上述朴素方法,我们可以观察到,在对任何偶数子数组执行右移1之后,奇数索引值将被偶数索引值代替,反之亦然。如果我们在移位之前找到偶数索引处的元素之和(例如sum ),那么在移位后,总和会被偶数索引和奇数索引处元素之间的连续差之和改变。
例如:
arr[] = {1, 2, 3, 4}
Sum element at even index in the above array = 1 + 3 = 4
Right shift array by 1, we have
arr1[] = {4, 1, 2, 3}
Sum element at even index in the above array = 4 + 2 = 6
therefore the sum get differ by 2 in the above two array which is equals the sum of consecutive difference in arr[] as ( (2 – 1) + (4 – 3) = 2.
我们将使用以上概念来解决此问题。步骤如下:
- 创建两个数组(例如arr1 []和arr2 [] ),以使arr1 []将元素的连续差值存储在数组arr []中,如下所示:
{(a[1] – a[0]), (a[3] – a[2]), . . ., (a[n]-a[n-1])}
并且arr2 []将元素在数组arr []中的连续差存储为:
{(a[1] – a[2]), (a[3] – a[4]), . . ., (a[n-1]-a[n])}
- 然后在上面形成的两个数组中使用Kadane算法找到最大子数组总和。
- 现在,最大和为原始数组( 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
15
时间复杂度: O(N)
辅助空间: O(N)