Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含列表中所有元素的最小递增序列数_Python_Python 3.x_Algorithm_Sequence - Fatal编程技术网

Python 包含列表中所有元素的最小递增序列数

Python 包含列表中所有元素的最小递增序列数,python,python-3.x,algorithm,sequence,Python,Python 3.x,Algorithm,Sequence,假设您有以下列表 a_list = [1, 2, 3, 4, 8, 7, 6] 我们希望从列表的任一侧找到包含列表所有元素的递增序列的最小数 对于上面的例子,我们将得到 序列=[[1,2,3,4,8],[6,7]] 它给出的答案是2。这是因为我们可以从左到右形成一个递增序列,如[1,2,3,4,8]。我们也可以形成从右到左的递增序列,如[6,7] 我已经考虑过创建两个列表,它们给出列表的所有递增顺序和列表的相反顺序 left_to_right = [[1,2,3,4,8],[7], [6]]

假设您有以下列表

a_list = [1, 2, 3, 4, 8, 7, 6]
我们希望从列表的任一侧找到包含列表所有元素的递增序列的最小数

对于上面的例子,我们将得到

序列=[[1,2,3,4,8],[6,7]]

它给出的答案是2。这是因为我们可以从左到右形成一个递增序列,如[1,2,3,4,8]。我们也可以形成从右到左的递增序列,如[6,7]

我已经考虑过创建两个列表,它们给出列表的所有递增顺序和列表的相反顺序

left_to_right = [[1,2,3,4,8],[7], [6]]
right_to_left = [[6,7,8], [4], [3], [2], [1]]

但我不确定从那里走到哪里。有什么想法吗?

编辑:下面的原文太复杂了。增加“从左”只意味着减少。因此,只需在列表上迭代一次,使用布尔标志跟踪序列的增减,使它们尽可能长,然后在最后计数。这应该行得通。没有测试

increasing = None
current_item = _list[0]
all_sequences = []
current_sequence = [_list[0]]

for item in _list[1:]:
    if increasing is None:
        increasing = item > current_sequence[-1]
        current_sequence.append(item)

    elif (item > current_item and increasing) or (item < current_item and not increasing):
        current_sequence.append(item)

    elif (item > current_item and not increasing) or (item < current_item and increasing):
        all_sequences.append(current_sequence)
        current_sequence = [item]
        increasing = None
    
    current_item = item
all_sequences.append(current_sequence)
result = len(all_sequences)
        



    
而不是,例如:

left_to_right = [[1,2],[3],[4,8],[7], [6]]
(从技术上讲,这也是一个不断增加的序列列表)

你的下一项工作是确保你得到清单上的所有数字。所以你必须选择一些递增序列。选择的序列越长,在不添加太多序列的情况下,“使用”的数字就越多。以你为例:

left_to_right = [[1,2,3,4,8],[7], [6]]
right_to_left = [[6,7,8], [4], [3], [2], [1]]
将两个列表连接在一起:

all = left_to_right + right_to_left
现在查找最长的序列:

longest = max(all, key=lambda x:len(x))
那会给你

[1,2,3,4,8]
现在重复,抓取下一个最长的序列,继续进行,直到捕捉到列表中的所有数字。这将给你:

[[1,2,3,4,8], [6,7,8]]
最后一步,检查是否存在重复项。然后你会得到

[[1,2,3,4,8], [6,7]]
如愿以偿


我想这应该总是给你最少的序列。但是如果有重复的,我可能错了。

我不明白这个问题。答案不总是2吗?你能举一个答案不是2的列表的例子吗?@Stef[1,10,2,9,3,8]代表example@Neil在这种情况下,答案是什么?开头有一个递增的序列[1,10],结尾有[8]。@Stef我在OPs中没有看到任何关于开头和结尾的问题,只有“从左”和“从右”。所以我的答案是3:[[1,10],[2,9],[3,8]]OP的例子也支持这种解释看起来不错,你可以通过不创建列表而只计算列表来进一步优化。非常感谢!当然,它的递减,解决它的方法是形成最大的“滚动”递增或递减序列。我要补充的唯一一点是,方程式可以是非递减的,而不是递增的,也可以是非递增的,而不是递减的,以适应相邻的重复值。
[[1,2,3,4,8], [6,7]]