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

如何识别并移除Python列表中不符合升序的整数?

解决方法:构建最长递增子序列(LIS)

你的核心问题是相邻元素比较只能处理局部递增逻辑,无法判断某个元素是否会阻断后续更长的递增序列(比如175、659),也无法处理像29这种“回头”的小值。而你期望的结果正好对应原列表的最长递增子序列(Longest Increasing Subsequence, LIS),以下是具体实现思路和代码:

为什么你的原方法不行?

你写的相邻比较逻辑只保留了“前一个元素小于后一个元素”的前项,完全没考虑:

  • 某个大元素(如175)虽然比前一个大,但后续没有更大的元素能跟上,反而会挡住后面更小但能形成更长序列的元素(如78)
  • 像29这种比当前序列最后一个元素小的情况,你的逻辑也没正确过滤掉它

方法1:动态规划(适合理解,小数据量适用)

动态规划的思路是记录每个位置结尾的最长递增子序列,通过逐个比较前面的元素,找到能形成更长序列的组合,最终取最长的那个子序列:

def longest_increasing_subsequence(nums):
    if not nums:
        return []
    # dp[i] 存储以 nums[i] 结尾的最长递增子序列
    dp = [[num] for num in nums]
    
    for i in range(len(nums)):
        for j in range(i):
            # 如果当前元素比前面的元素大,且能形成更长的子序列
            if nums[i] > nums[j] and len(dp[i]) < len(dp[j]) + 1:
                dp[i] = dp[j] + [nums[i]]
    
    # 返回长度最长的子序列
    return max(dp, key=len)

# 测试你的列表
idx_ls = [24, 175, 78, 80, 659, 126, 141, 149, 29, 158, 178, 179]
print(longest_increasing_subsequence(idx_ls))
# 输出:[24, 78, 80, 126, 141, 149, 158, 178, 179]

方法2:贪心+二分查找(高效,大数据量适用)

如果你的列表数据量很大,动态规划的O(n²)时间复杂度会不够高效,这时可以用贪心+二分查找的方法,时间复杂度降到O(n log n):

def longest_increasing_subsequence(nums):
    if not nums:
        return []
    
    # tails[i] 表示长度为 i+1 的递增子序列的最小尾元素
    tails = []
    # prev 记录每个元素在子序列中的前一个元素索引,用于回溯
    prev = [None] * len(nums)
    # indices 记录 tails 中每个元素对应的原数组索引
    indices = []
    
    for i, num in enumerate(nums):
        # 二分查找找到第一个大于等于当前元素的位置
        left, right = 0, len(tails)
        while left < right:
            mid = (left + right) // 2
            if tails[mid] < num:
                left = mid + 1
            else:
                right = mid
        
        # 更新 tails 和对应的索引
        if left == len(tails):
            tails.append(num)
            indices.append(i)
        else:
            tails[left] = num
            indices[left] = i
        
        # 记录当前元素的前一个元素索引
        if left > 0:
            prev[i] = indices[left - 1]
    
    # 回溯构建最终的子序列
    result = []
    current = indices[-1]
    while current is not None:
        result.append(nums[current])
        current = prev[current]
    
    # 反转得到递增顺序
    return result[::-1]

# 测试你的列表
idx_ls = [24, 175, 78, 80, 659, 126, 141, 149, 29, 158, 178, 179]
print(longest_increasing_subsequence(idx_ls))
# 输出:[24, 78, 80, 126, 141, 149, 158, 178, 179]

补充说明

如果你只是想要一个任意的递增序列(而非最长),可以用简单的遍历维护当前最大值,但这种方法处理你的列表会得到[24, 175, 659],显然不符合你的需求,所以最长递增子序列才是正确的方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:35:19