在整数列表C#中找到倒数第二个最大元素

我有一个

list<int> input = //from db of one million records

百万记录。

尽管我知道使用input.OrderByDescending().Skip(1).Take(1)可以解决问题,但是如果我有一百万条记录,则不是最佳做法OrderBY

在这种情况下,当我们有更多记录时,哪种解决方案是最佳解决方案?


大话西游666
浏览 218回答 3
3回答

jeck猫

浏览列表,同时跟踪max,以及max2,你会得到O(N)与O(N * log(N))时间复杂度:&nbsp; // Maximum value&nbsp; int max&nbsp; = Math.Max(input[input.Count - 1], input[input.Count - 2]);&nbsp; // Second greatest&nbsp; &nbsp;&nbsp; int max2 = Math.Min(input[input.Count - 1], input[input.Count - 2]);&nbsp; // i >= 0: Comparing with 0 is slightly faster then with Count&nbsp; for (int i = input.Count - 3; i >= 0; --i) {&nbsp; &nbsp; int v = input[i];&nbsp; &nbsp; if (v >= max) {&nbsp; &nbsp; &nbsp; max2 = max;&nbsp; &nbsp; &nbsp; max = v;&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; else if (v > max2)&nbsp;&nbsp; &nbsp; &nbsp; max2 = v;&nbsp; }编辑:如果重复项应被忽略(请参见下面的评论),则答案[1, 2, 3, 4, 4, 4, 4]应为3,而不是4:&nbsp; // Maximum value&nbsp; int max = int.MinValue;&nbsp; // Second greatest&nbsp; &nbsp;&nbsp; int max2 = int.MinValue;&nbsp; // i >= 0: Comparing with 0 is slightly faster then with Count&nbsp; for (int i = input.Count - 1; i >= 0; --i) {&nbsp; &nbsp; int v = input[i];&nbsp; &nbsp; if (v > max) {&nbsp; &nbsp; &nbsp; max2 = max;&nbsp; &nbsp; &nbsp; max = v;&nbsp; &nbsp; }&nbsp; &nbsp; else if (v > max2 && v != max)&nbsp; &nbsp; &nbsp; max2 = v;&nbsp; }

慕尼黑的夜晚无繁华

您可以通过跟踪下一个最大值并在列表中进行一次迭代来做到这一点。int max = Int32.MinValue;int nextMax = Int32.MinValue;for(int i=0; i<list.Count(); i++){&nbsp; if(list[i] > max)&nbsp; {&nbsp; &nbsp; nextMax = max;&nbsp; &nbsp; max = list[i];&nbsp;&nbsp; }&nbsp; else if(list[i] > nextMax)&nbsp; {&nbsp; &nbsp; nextMax = list[i];&nbsp; }}

绝地无双

这是一个仅使用LINQ和C#7元组迭代一次的解决方案:var input = Enumerable.Range(0, 101);var topTwo = input.Aggregate((Biggest: Int32.MinValue, SecondBiggest: Int32.MinValue),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(acc, next) =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (next > acc.Biggest)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;acc.SecondBiggest = acc.Biggest;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;acc.Biggest = next;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (next < acc.Biggest && next > acc.SecondBiggest)&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;acc.SecondBiggest = next;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return acc;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});WriteLine(topTwo.SecondBiggest);&nbsp; // 99
打开App,查看更多内容
随时随地看视频慕课网APP