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

Longest consecutive sequence where each element is less than 3

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

我正在考虑制作两个功能; 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     

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

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)

如果您想进一步改进编码,也许可以尝试编辑程序,使其打印出所有最长的序列(即,如果有 2 个最长的不同序列,则打印出它们,而不仅仅是第一个)。