【问题标题】:Smallest number of increasing sequences that contain all elements of a list包含列表所有元素的最小递增序列数
【发布时间】:2021-02-02 10:33:43
【问题描述】:

假设你有以下列表

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]]

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

【问题讨论】:

  • 我不明白这个问题。答案不是总是 2吗?你能举一个答案不是 2 的列表的例子吗?
  • @Stef [1, 10, 2, 9, 3, 8] 例如
  • @Neil 在这种情况下答案是什么?开头有一个递增序列[1, 10],结尾有[8]。
  • @Stef 我在 OP 中没有看到任何关于开始和结束的问题,只有“从左”和“从右”。所以我的答案是 3:[[1,10],[2,9],[3,8]]
  • OP的例子也支持这种解释

标签: python python-3.x algorithm sequence


【解决方案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]]

(从技术上讲,这也是一个递增序列的列表)。

您的下一项工作是确保您获得列表中的所有数字。所以你必须选择一些递增的序列。您选择的序列越长,您在不添加太多序列的情况下“用完”的数字就越多。举个例子:

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]]

根据需要

我怀疑这应该总是给你最少的序列。但也许如果有重复我可能是错的。

【讨论】:

  • 看起来不错,您可以通过不创建列表而只计算它们来进一步优化。
  • 非常感谢!当然,它的递减和解决方法是形成最大的“滚动”递增或递减序列。我唯一要补充的是,方程可以是非递减而不是递增,非递增而不是递减以适应相邻的重复值。
猜你喜欢
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2012-10-11
  • 2014-05-20
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多