如何使用LINQ选择最小子序列

  • 本文关键字:何使用 LINQ 选择 linq
  • 更新时间 :
  • 英文 :


如果我有一个高尔夫结果数组:

 -3, +5, -3, 0, +1, +8, 0, +6, +2, -8, +5

我需要找到一个由三个相邻数字组成的序列,它们的和最小。对于这个例子,子序列是:

 [-3, +5, -3]
 [+5, -3,  0]
 [-3,  0, +1]
 ... etc ...
 [+2, -8, +5]

并且最小序列将是和为-2的CCD_ 1。

您可以使用以下LINQ查询:

int[] golfResult = { -3, +5, -3, 0, +1, +8, 0, +6, +2, -8, +5 };
var combinations = from i in Enumerable.Range(0, golfResult.Length - 2)
                   select new { 
                       i1 = golfResult[i], 
                       i2 = golfResult[i + 1], 
                       i3 = golfResult[i + 2], 
                   };
var min = combinations.OrderBy(x => x.i1 + x.i2 + x.i3).First();
int[] minGolfResult = { min.i1, min.i2, min.i3 }; // -3, 0, +1

当然,您需要检查数组中是否至少有三个结果。

我不知道你为什么要用LINQ做这件事。我认为直接的迭代解决方案更容易理解:

int[] scores = new[] { -3, 5, -3, 0, 1, 8, 0, 6, 2, -8, 5 };
int minimumSubsequence = int.MaxValue;
int minimumSubsequenceIndex = -1;
for (int i = 0; i < scores.Length - 2; i++)
{
    int sum = scores[i] + scores[i + 1] + scores[i + 2];
    if (sum < minimumSubsequence)
    {
        minimumSubsequence = sum;
        minimumSubsequenceIndex = i;
    }
}
// minimumSubsequenceIndex is index of the first item in the minimum subsequence
// minimumSubsequence is the minimum subsequence's sum.

如果你真的想在LINQ中做到这一点,你可以这样做:

int length = 3;
var scores = new List<int>() { -3, +5, -3, 0, +1, +8, 0, +6, +2, -8, +5 };
var results =
    scores
    .Select((value, index) => new
    {
        Value = scores.Skip(index - length + 1).Take(length).Sum(),
        Index = index - length + 1
    })
    .Skip(length - 1)
    .OrderBy(x => x.Value)
    .First()
    .Index;

这将创建第二个列表,该列表将所有长度前面的元素相加,然后对其进行排序

相关内容

  • 没有找到相关文章

最新更新