C#最长非递减序列的长度未排序

时间:2015-12-25 09:57:03

标签: c# arrays list indexing

我有一个列表,里面有一些值

for (int i = 0; i < InputNumbers.Length; i++)
        {
            InputNumbers[i] = Convert.ToInt32(Console.ReadLine());
            LongestSequence.Add(InputNumbers[i]);
        }
        for (int i = 0; i < InputNumbers.Length; i++)
        {
            if (i > 0)
            {
                if (LongestSequence[i] < LongestSequence[i - 1])
                {
                    LongestSequence.Remove(LongestSequence[i]);
                    LongestSequence.Insert(i, null);
                }
            }
        }

正如您所看到的,我将我的数组InputNumbers中的所有值添加到列表LongestSequence中,在此之后我将删除其中一些值并插入&#34; null&#34;在替换值索引处。所以这会产生类似边框的东西:

null
1  
2
null

我想知道这两个空值之间的值的长度。在这种情况下它是2

  • 如果输入为1 2 3 0,则null将在开始处并且将替换零,因为0小于3并且我正在寻找最长的非递减序列

1 个答案:

答案 0 :(得分:0)

看起来像XY问题。你需要找到最长的非递减序列,你发现了一种可怕的方法,现在你希望我们帮助你。最好直接询问最长的非递减序列。设置null中没有必要,然后尝试在它们之间查找值。

您可以执行以下操作:

List<int> current = new List<int> { Int32.MaxValue };
int[] best = new int[0];

int n = int.Parse(Console.ReadLine());   

for (int i = 0; i < n; i++)
{
    var read = int.Parse(Console.ReadLine());

    if (read < current[current.Count - 1])
    {
        if (current.Count > best.Length) best = current.ToArray();
        current.Clear();
    }

    current.Add(read);
}

if (current.Count > best.Length) best = current.ToArray();

// Here, "best" stores the best result

它看起来更清晰,透明和可读 但是,我坚信有更多更短更优雅的解决方案。