给定一个数组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
Javascript
15
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。