You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中如何为列表添加末尾元素?求最长递增子序列遇代码问题

解决最长连续递增序列问题

我明白你现在遇到的困扰啦——你的代码因为循环只到numbers.Count - 1,导致最后一个符合条件的元素永远没法加入序列,而且当前逻辑也没法完整跟踪最长的递增序列(比如处理序列中断、比对多个序列长度这些场景都没覆盖到)。

先拆解下你代码里的几个小问题:

  • 循环终止条件i < numbers.Count - 1确实会遗漏最后一个元素,因为你只在numbers[i] < numbers[i+1]时添加numbers[i],但最后一个元素没有i+1可以比对
  • 额外的numbers[i] > 0限制会过滤掉所有非正数元素,如果你不是特意要排除负数,这个条件可以去掉
  • 没有处理序列中断的情况:遇到不递增的元素时,应该重置当前序列,再和已记录的最长序列做长度比对

接下来给你一个完整的解决方案,能处理连续递增的序列,而且会保留最先出现的最长序列:

List<int> numbers = new List<int> { 1, 3, 5, 2, 4, 6, 7, 1 }; // 示例输入
List<int> longestSequence = new List<int>();
List<int> currentSequence = new List<int>();

// 处理空列表的边界情况
if (numbers.Count == 0)
{
    Console.WriteLine("空列表,无序列可输出");
    return;
}

// 先把第一个元素加入当前序列
currentSequence.Add(numbers[0]);

for (int i = 1; i < numbers.Count; i++)
{
    // 如果当前元素比前一个大,就加入当前序列
    if (numbers[i] > numbers[i - 1])
    {
        currentSequence.Add(numbers[i]);
    }
    else
    {
        // 序列中断,对比当前序列和最长序列的长度
        if (currentSequence.Count > longestSequence.Count)
        {
            longestSequence = new List<int>(currentSequence);
        }
        // 重置当前序列,从当前元素重新开始
        currentSequence.Clear();
        currentSequence.Add(numbers[i]);
    }
}

// 循环结束后必须再做一次比对:最后一段递增序列还没被检查
if (currentSequence.Count > longestSequence.Count)
{
    longestSequence = new List<int>(currentSequence);
}

// 输出结果
Console.WriteLine("最长递增序列:");
foreach (int num in longestSequence)
{
    Console.Write(num + " ");
}

代码说明:

  • 从第二个元素开始遍历,和前一个元素做比较,确保每个元素都能被处理到
  • 每次序列中断时,立即比对当前序列与最长序列的长度,更新最长序列
  • 循环结束后的最终比对,避免遗漏最后一段可能的最长序列
  • 若存在多个长度相同的最长序列,因为我们只在当前序列更长时才更新,所以会自动保留最先出现的那个

测试示例输入{1,3,5,2,4,6,7,1},输出会是2 4 6 7,这是最长的连续递增序列。如果你的需求是非连续的最长递增子序列(比如1,3,5,6,7这种不连续但递增的),可以随时告诉我,我再给你调整代码~

内容的提问来源于stack exchange,提问作者Nevion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:57:01