当前位置: 首页 > 知识库问答 >
问题:

每个元素小于3的最长连续序列

孟杰
2023-03-14

我以前见过一些最长的连续序列问题,比如查找递增子序列。我现在正在努力进一步发展我的技能。给定一个整数数组,我想找到一个最长的连续序列,其中各个子序列中所有元素的差值小于一个给定的数字,例如3。一个例子是[10,11,12,15,13],其中只有前三个元素满足条件。此外,我还想返回给定数组中第一个和最后一个元素的索引。

我想做两个函数;get_first_element(arr)和get_last_element(arr)。

def get_last_ele(arr):
    longest_seq = 0
    last_ele = 0

    max_difference = 3

    for i in range (0, len(arr)):

        max_ele_seq = arr[i]
        min_ele_seq = arr[i]
        _count = 0
        _last_ele = i
        for j in range(i,len(arr)-i+1):
            ele_j = arr[j]
            if ele_j > max_ele_seq:
                max_ele_seq = ele_j
            if ele_j < min_ele_seq:
                min_ele_seq = ele_j
            if abs(max_ele_seq - min_ele_seq) > max_difference:
                break

            last_ele = j
            _count += 1

        if _count > longest_seq:
            longest_seq = _count
            last_ele = last_ele

    return last_ele     

我觉得我可以重新使用这段代码来获得第一个元素,但那将是多余的,以有两个相似的函数。是否有可能在一个函数中实现所有这些功能?在时间复杂性方面是否有更好的解决方案?

共有1个答案

步兴德
2023-03-14
def get_longest_sequence(arr):
    """
    Prints out the longest sequence, its length, and the index of its first and last elements

    arr: list of numbers
"""

    longest_seq_length = 0
    last_ele_index_of_longest_seq = 0
    max_difference = 3

    for i in range(0, len(arr)): 

        max_ele_seq = arr[i]
        min_ele_seq = arr[i]

        count = 0

        for j in range(i, len(arr)):

            ele_j = arr[j]
            if ele_j > max_ele_seq:
                max_ele_seq = ele_j
            elif ele_j < min_ele_seq:
                min_ele_seq = ele_j

            if max_ele_seq - min_ele_seq > max_difference: # no need for abs() since max always larger than min
                break

            last_ele_index = j
            count += 1

        if count > longest_seq_length:
            longest_seq_length = count
            last_ele_index_of_longest_seq = last_ele_index
            # no need for last_ele = last_ele, it does nothing, merely reassigns itself

    longest_seq = arr[(last_ele_index_of_longest_seq - longest_seq_length + 1):(last_ele_index_of_longest_seq + 1)]
    print(f"The longest sequence found: {longest_seq}")
    print(f"Its length: {longest_seq_length}")
    print(f"Index of first element (with regards to arr): {last_ele_index_of_longest_seq - longest_seq_length + 1}")
    print(f"Index of last element: {last_ele_index_of_longest_seq}")

arr = [10,11,12,15,13]
get_longest_sequence(arr)

如果你想进一步改进你的编码,也许可以尝试编辑程序,使它能够打印出所有最长的序列(例如,如果有两个最长的不同序列,则打印出两个序列,而不是只打印出第一个序列)。

 类似资料:
  • 给定一个由n个非负整数组成的数组(ARR[]),我们必须找到元素的最小和,以便每3个连续元素中至少有一个被选中。 请解释所形成的递归方程背后的直觉。为什么添加当前的第i个第数组元素和最后三次递归调用的结果的最小值会给出大小为i的数组的正确答案呢?

  • 给定一个列表{x_i},我想要找到从每个元素开始的最长的递增子序列,使得起始元素包含在子序列中。 最明显的方法是对每个元素执行通常的最长递增子序列算法,给出O(n^2logn)。这能打吗?

  • {4,5,1,5,7,6,8,4,1},答案是5。 对于第一个例子,子数组{5,3,1,4,2}排序后可以形成连续序列1,2,3,4,5,它们是最长的。 对于第二个示例,子数组{5,7,6,8,4}是结果子数组。

  • 例如: 给定为序列,和是要考虑的有效子序列,但不是,因为它包含连续的元素3和2。 如何找到一个最长的子序列,使它在中单调递减 我知道问题的版本包含单调的增加/减少。 但这里的附加条件让它变得困难。 有没有更好的办法?

  • 所以,我有一个所有正自然数的数组。给我一个阈值。我必须找出总和小于给定阈值的数字(连续的)的最大计数。 输入数组的最大大小可以为 10^5。 基本上,我想到了一种算法,它计算原始数组的子集中元素的数量,这些元素的总和将小于给定的阈值。但是,这将导致O(N^2).的复杂性有人能建议一个更好的算法吗?我不是在寻找一个代码,只有一个算法/伪代码将做得很好。谢谢!

  • 给定一个向量和一个有序向量,我想要一个向量,其中 ] 等于 中最小元素的索引,以便