C# 从数组算法中的当前数字中找到最右边的数字

C# 从数组算法中的当前数字中找到最右边的数字,c#,performance,algorithm,big-o,C#,Performance,Algorithm,Big O,我的算法应该从输入的数组中的当前数字中找到最大的正确的数字,例如,给定以下int[]输入: 5,9,6,1,3,2 我的算法将输出: 9,6,3,3,2,2 这是我目前的代码: public static int[] FindGreatestRightNumber(int[] input) { var output = new int[input.Length]; for (var i = 0; i < input.Length; i++) { in

我的算法应该从输入的
数组中的当前数字中找到最大的正确的数字,例如,给定以下
int[]
输入:

5,9,6,1,3,2

我的算法将输出:

9,6,3,3,2,2

这是我目前的代码:

public static int[] FindGreatestRightNumber(int[] input)
{
    var output = new int[input.Length];
    for (var i = 0; i < input.Length; i++)
    {
        int maxRightNumber = (i == input.Length - 1 ? input[i] : 0);

        for (var j = i+1; j < input.Length; j++)
        {
            var currentNumber = input[j];
            if (maxRightNumber < currentNumber)
                maxRightNumber = currentNumber;
        }
        output[i] = maxRightNumber;
    }

    return output;
}
public static int[]findCreateStrightNumber(int[]输入)
{
var输出=新整数[input.Length];
对于(变量i=0;i
有人告诉我可以快得多,怎么办?有什么想法吗


更新:请不要在您的答案中使用
LINQ
,我想熟悉使用简单代码、无
LINQ
、IEnumerable
扩展方法等更快解决问题的方法。

如果您想跳过某些项目并搜索最大值,则非常简单

int[]arr = {5, 9, 6, 1, 3, 2};
int currentIndex = 2;
int currentValue = 6;
int max = arr.Skip(currentIndex).Where(f => f > currentValue).Max();
编辑如果只想对数组排序,则:

   int[] sorted = arr.OrderByDescending();
为什么不只是使用方法呢

返回Int32值序列中的最大值

这里有一个


因为,我现在对这个问题看得更清楚了,弗拉德的答案看起来是正确的。

你可以从右手边一次传球就完成这项任务。诀窍是实现maxRightVal(n)=max(maxRightVal(n+1),value(n+1)):


这将取每个元素右侧的最大值

 int[] input = {5, 9, 6, 1, 3, 2};
 int[] output = input
            .Take(input.Length-1)
            .Select( (x,i) => input.Skip(i+1).Max()).ToArray();

从第(n-2)个元素开始,维护一个用第n个元素初始化的当前最大数组。如果当前元素大于max array中的元素,则继续更新它。继续此操作,直到到达第一个元素。

@Saen:算法是:
对于每个输入数字,输出最大的*后续*数字,或者如果没有后续数字,则输出输入数字。
,至少根据给出的示例。是的,我想知道为什么输出序列中没有
5
。考虑到修正后的算法,我不确定它是否能快得多。他希望每个数字右边都有一个最大数字。弗拉德的回答更接近正确。@Lc。你公式中的n是多少?@YairNevet元素index@lc. 说我的代码是O(n^2)而你的代码是O(n)是准确的吗?
var output = new int[input.Length];
output[input.Length-1] = input[input.Length-1];

for(int i = input.Length - 2; i >= 0; i--)
    output[i] = output[i+1] > input[i+1] ? output[i+1] : input[i+1];
 int[] input = {5, 9, 6, 1, 3, 2};
 int[] output = input
            .Take(input.Length-1)
            .Select( (x,i) => input.Skip(i+1).Max()).ToArray();