Java 计算总和为偶数的数组中的最大数

Java 计算总和为偶数的数组中的最大数,java,arrays,performance,sum,Java,Arrays,Performance,Sum,我有一段代码,据我所知,它搜索给定数组中最大数量的连续数,其和为偶数 private static int f (int[]a, int low, int high) { int res = 0; for (int i=low; i<=high; i++) res += a[i]; return res; } public static int what (int []a) { int temp = 0; for (int i=0; i&

我有一段代码,据我所知,它搜索给定数组中最大数量的连续数,其和为偶数

private static int f (int[]a, int low, int high)
{
    int res = 0;
    for (int i=low; i<=high; i++)
    res += a[i];
    return res;
}


public static int what (int []a)
{
    int temp = 0;
    for (int i=0; i<a.length; i++)
    {
        for (int j=i; j<a.length; j++)
        {
            int c = f(a, i, j);
            if (c%2 == 0)
            {
            if (j-i+1 > temp)
            temp = j-i+1;
            }
        }
    }
return temp;
} 
私有静态int f(int[]a,int低,int高)
{
int res=0;

对于(inti=low;i您只需要一个循环,它需要O(n)

您需要在数组上迭代一次,然后计算偶数和奇数。如果
oddCount
为偶数,则输出为
evenCount+oddCount
,否则输出为
evenCount+oddCount-1

这是因为所有偶数的和都是偶数。每对奇数的和也是偶数,所以元素最多的偶数和有一个元素数,要么是数组的长度(如果奇数是偶数),要么是数组的长度-1(如果奇数中有奇数,在这种情况下,您必须将其中一个从总和中排除,才能得到偶数总和)

实际上,您只需计算奇数:

public static int maxEvenSumLength (int []a)
{
    int oddCount = 0;
    for (int i=0; i<a.length; i++)
    {
        if (a[i] % 2 == 1) {
          oddCount++;
        }
    }
    return (oddCount % 2 == 0) ? a.length : (a.length - 1);
} 
public static int maxEvenSumLength(int[]a)
{
int oddCount=0;

对于(int i=0;iHint:您只需要计算数组中有多少奇数,以及数组中有多少偶数。需要计算奇数和偶数的数量,表示numOdd和numEven-如果该numOdd是偶数,那么您的答案是(numOdd+numEven),否则您的答案是(numOdd+numEven-1)刚才注意到这个方法没有考虑数组中数字的顺序。方法“what”按顺序扫描数组,看看连续数之和是否为偶数。@AlexyGrabov哦,我错过了连续部分。所以你基本上移动了两个指针,一个从数组开始,一个从数组结束,然后向中间移动。循环结束后,你让它们指向两个奇数角。Th最后一部分我没有得到-“连续偶数和的长度将是最后一个奇数之前或第一个奇数之后的元素数(两个中的较大者)。”但代码仍然有效:)@AlexyGrabov我的意思是,如果你有奇数个奇数元素,比如
123456
,那么具有偶数和的最长连续序列要么是
12344
(最后一个奇数之前的所有元素,即5),要么是
23456
(第一个奇数之后的所有元素,即1).你在这两个序列中取较长的一个,在本例中长度为5。对了,在回家的路上想了想,明白了代码的工作原理。非常感谢!
public static int maxConsecutiveEvenSumLength (int []a)
{
    int oddCount = 0;
    int firstOddIndex = -1;
    int lastOddIndex = a.length;
    for (int i=0; i<a.length; i++)
    {
        if (a[i] % 2 == 1) {
          oddCount++;
          if (firstOddIndex < 0)
              firstOddIndex = i;
          lastOddIndex = i;
        }
    }
    if (oddCount % 2 == 0) {
        return a.length;
    } else {
        return Math.max(a.length - firstOddIndex - 1,lastOddIndex);
    }
}