【问题标题】:Given an array of N elements. The task is to find the length of the longest subarray such that sum of the subarray is even给定一个包含 N 个元素的数组。任务是找到最长子数组的长度,使得子数组的总和是偶数
【发布时间】:2021-10-09 07:12:06
【问题描述】:

对于给定的问题,我提出了以下代码。但这似乎并不能解决问题。请查看并提出更改建议。

#include <iostream>
#include <limits.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    
    int arr[n];
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    
    int maxim=INT_MIN;
    for(int i=0;i<n;i++)
    {
        int sum=0;
        for(int j=i;j<n;j++)
        {
            sum+=arr[j];
            if (sum%2==0){
                int len=n-i;
                maxim=max(maxim,len);
            }
        }
    }
    cout<<maxim;
    return 0;
}

【问题讨论】:

  • 我投票结束这个问题,因为它需要一般调试帮助。
  • 你可以看看kadane's algorithm/kadane's algo YT video,它找到了最大和的最长子数组。您可以对其进行调整以找到最长的偶数子数组。
  • @Ch3steR,您能告诉我如何以灰色突出显示文本吗?谢谢。
  • 将代码包裹在两个` 字符之间(通常在esc 键下找到)

标签: c++ arrays sub-array


【解决方案1】:

我认为第二个 for 循环中的原始行“int len=n-i”存在错误,因为您在此处错误地计算了 len。

也许,您应该使用这个新公式“int len= j - i + 1”来计算 len,这似乎是准确的 len。

#include <iostream>
#include <limits.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    
    int arr[n];
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    
    int maxim=INT_MIN;
    for(int i=0;i<n;i++)
    {
        int sum=0;
        for(int j=i;j<n;j++)
        {
            sum+=arr[j];
            if (sum%2==0){

                int len= j - i + 1;  // Calculate len here

                maxim=max(maxim,len);
            }
        }
    }
    cout<<maxim;
    return 0;
}

注意:您上面的算法的时间复杂度为 O(n^2)。肯定还有其他更好的算法,其时间复杂度为 O(n) 来解决这个问题。

【讨论】:

  • 感谢您的解决方案,绝对帮助我了解我所缺少的。是的,可能还有另一种更有效的解决方案,但由于我对子数组概念有点陌生,我想尝试我的蛮力方法。
【解决方案2】:

首先检查数组的总和是否为偶数。如果数组的总和为偶数,则答案将为 N。 如果数组的总和不是偶数,则表示它是奇数。因此,我们的想法是从数组中找到一个奇数元素,排除该元素并比较数组的两个部分的长度,我们可以获得偶数和的子数组的最大长度。

int maxLength(int a[], int n){
    int sum = 0, len = 0;
 
    // Check if sum of complete array is even
    for (int i = 0; i < n; i++)
        sum += a[i];
 
    if (sum % 2 == 0) // total sum is already even
        return n;
 
    // Find an index i such the a[i] is odd
    // and compare length of both halfs excluding
    // a[i] to find max length subarray
    for (int i = 0; i < n; i++) {
        if (a[i] % 2 == 1)
            len = max(len, max(n - i - 1, i));
    }
 
    return len;
}

【讨论】:

  • 你只需要从左到右找到第一个奇数元素,从右到左找到第一个奇数元素。
猜你喜欢
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2022-01-05
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多