获取数组中连续元素的最大和

时间:2018-10-26 10:20:20

标签: c# arrays

我想获得数组中三个连续元素的最大和以及该最大和的起始元素的索引。

在给定的数组中,

int a[] = {2,1,3,2,4,6,7,9,1}     

最大sum = 6 + 7 + 9 = 22 最大总和的起始索引为5(起始项的索引-6)。

我写了下面的代码,但是效率不高。不确定使用 Linq 是否会带来更好的结果

任何人都可以建议任何更好的方法。

private static int[] getConsecutiveSum(int[] a, int k)
        {
            List<int> lst = new List<int>();
            for (int x = 0; x < a.Length; x++)
            {
                lst.Add(getsum(a, x, k));
            }

            var max = lst[0];
            var index = 0;
            for(var i = 0; i <lst.Count; i++)
            {
                if(lst[i] > max)
                {
                    max = lst[i];
                    index = i;
                }
            }
            int[] result = new int[2];
            result[0] = max;
            result[1] = index;
            return result;
        }

        private static int getsum(int[] a, int s, int e)
        {
            var sum = 0;
            var loop = 1;
            for (int x = s; x < a.Length; x++)
            {
                sum = sum + a[x];
                loop++;
                if (loop > e) break;
            }
            if (loop > e) return sum;
            else return 0;
        }
}

3 个答案:

答案 0 :(得分:2)

您不希望任何 collection list)找到最大值;我们只需要扫描该数组。由于我们要返回2的值,因此我们将Tuple<int, int>用作最简单的实现

private static Tuple<int, int> getMaxSum(int[] a, int k) {
  int sum = a.Take(k).Sum();
  int max = sum;
  int index = 0;

  for (int i = k; i < a.Length; ++i) {
    sum = sum - a[i - k] + a[i];

    if (sum > max) {
      max = sum;
      index = i - k + 1;
    }
  }

  return Tuple.Create(max, index);
}

...

int a[] = new int[] {
  2, 1, 3, 2, 4, 6, 7, 9, 1};

var result = getMaxSum(a, 3);

Console.Write($"Sum is {result.Item1}; starting index is {result.Item2}");

结果

Sum is 22; starting index is 5

答案 1 :(得分:1)

在不使用Linq的情况下,它将提高性能。由于您需要方法中的两个值,因此可以使用out参数:

private static void GetConsecutiveSum(int[] values, out int maximumSum, out int startIndex)
{
    maximumSum = 0;
    startIndex = -1;
    for (int i = 0; i < values.Length - 2; i++)
    {
        int sequenceSum = values[i] + values[i + 1] + values[i + 2];
        if (sequenceSum > maximumSum)
        {
            maximumSum = sequenceSum;
            startIndex = i;
        }
    }
}

答案 2 :(得分:0)

好吧,在LINQ中将是这样的:

var result = a.Select((s, i) => new { Sum = a.Skip(i).Take(3).Sum(), Index = i })
              .OrderByDescending(o => o.Sum)
              .First();

Console.WriteLine($"MaxSum: {result.Sum}, StartIndex: {result.Index}");

输出:

  

MaxSum:22,开始索引:5

对于您的任务,它看起来像这样:

private static int[] getConsecutiveSum(int[] a, int k)
{
    int[] result = new int[2];
    var maxSum = a.Select((s, i) => new { Sum = a.Skip(i).Take(k).Sum(), Index = i })
                  .OrderByDescending(o => o.Sum)
                  .First();
    result[0] = maxSum.Sum;
    result[1] = maxSum.Index;
    return result;
}

我没有将您的方法的返回类型从int[]更改为元组或其他内容,因为如果是在线编码方面的挑战或某些挑战,那么我猜您将不允许更改该方法的返回类型(使代码检查自动化成为可能。