获取排序数组中属于算术级数系列

时间:2018-04-19 19:15:48

标签: python math

鉴于AP系列的第一个要素和共同点。如何找到属于AP系列的排序数组(允许重复)中的元素总数。是否可以在O(N)以下的时间内完成?

到目前为止我尝试了什么

if (arr[i]-a)%d == 0: 
   count+=1

Constraints: 1<=d<=10^5 , 0<=a<=10^5

例如:a = 1d = 3

[1,2,4,6,7,7,9,10]

答案:5

基本上我想查找a+dx形式的总数,因此步长可以是d

1 个答案:

答案 0 :(得分:0)

除非你删除了重复,否则我认为这个问题没有比O(N)更快的解决方案。

话虽这么说,这是我能提出的最快的实施方案:

def is_part_of_sequence(a, d, x):
    return (x%d) == a

def get_length(a, d, l):
    # going to be using this a few times in this function
    ips = is_part_of_sequence

    # get the length of the list
    n = len(l)

    # get the first value in the sequence
    min_seq_ind, min_seq_value = next(
        (i, v) for i, v in enumerate(l) 
        if v == a
    )

    # get the last value in the sequence
    max_seq_ind, max_seq_value = next(
        (n-i-1, v) for i, v in enumerate(reversed(l)) 
        if ips(a, d, v)
    )

    min_length = ((max_seq_value - a)//d) + 1  # this is the minimum length

    # check to see if min_length is the correct answer- if so, short circuit
    if min_length == (max_seq_ind - min_seq_ind + 1):
        return min_length

    count = 2
    count += sum(1 if ips(a, d, l[i]) else 0 for i in range(min_seq_ind+1, max_seq_ind))

    return count

这里唯一的优化是,在序列不包含重复的情况下,该算法是恒定时间,因为它可能会短路。